<template> <view class="answerdetail-page flex-column"> <template v-if="questionItem&&hasAuth"> <template> <view class="question-wrap"> <view class="question-item"> <view class="question-info"> <view style="flex: 1" class="question-title"> <text class="item-label">{{ questionItem.variety_tag_name }}</text> {{ questionItem.question_content }} </view> <view class="item-answer" v-if="questionItem.reply_status === 3&&!isUserResearcher"> <view class="answer" @click.stop="handlePlayAudioByBg(questionItem)"> <!-- 改为背景音频播放 --> <image class="music-img" :src="questionItem.community_question_id==curVoiceId&&!curAudioPaused?playImgSrc:pauseImgSrc" mode="widthFix"/> <text>{{ formatAudioTime(questionItem.audio_list[0].audio_play_seconds*1000) }}</text> <!-- <template v-if="!questionItem.loading"> <image class="music-img" :src="questionItem.answer.isplay ? playImgSrc : pauseImgSrc" mode="widthFix" /> <template v-if=" questionItem.answer.isplay || questionItem.answer.ispause " > <text>{{ questionItem.answer.audioTime - currentAudioMsg.audioCurrentTime > 0 ? dayjs( (questionItem.answer.audioTime - currentAudioMsg.audioCurrentTime) * 1000 ).format("mm:ss") : "00:00" }}</text> </template> <template v-else> <text>{{ dayjs(questionItem.answer.audioTime * 1000).format( "mm:ss" ) }}</text> </template> </template> <template v-else> <image class="load-img" src="../static/loading.png" mode="aspectFill" /> <text>{{ dayjs(questionItem.answer.audioTime).format("mm:ss") }}</text> </template> --> </view> <!-- 普通用户进入的音频悬浮 --> <audioBox v-if="showAudioPop"/> </view> </view> <text class="item-time">提问时间:{{ questionItem.create_time }}</text> </view> </view> <view class="record-wrap flex-column" v-if="questionItem.reply_status === 2&&isUserResearcher" > <view class="record flex-column" v-if="questionItem.recordStatus !== 4"> <view class="no-record" v-if="questionItem.recordStatus === 1"> <image src="./static/record.png" mode="widthFix" style="width: 90rpx; height: 180rpx" /> <view>无录音(录音时长超过三分钟自动结束)</view> <view class="black-btn" style="margin-top:100rpx" @click.stop="showRemoveQ=true">转移问题</view> <view class="black-btn" style="margin-top:50rpx" @click.stop="stopQuestion.show=true">终止问答</view> </view> <!-- <view class="record-time" v-else>{{ audioTime }}</view> --> <view class="recode-image" v-else> <scroll-view scroll-x style="height: 100rpx" class="scroll-view" :scroll-left="scrollTop" @scrolltolower="handleScrolltolower" :show-scrollbar="false"> <view style="width:100%;height:100rpx;display:inline-block;"></view> <image src="./static/record-img.png" mode="scaleToFill" /> <image src="./static/record-img.png" mode="scaleToFill" /> <image src="./static/record-img.png" mode="scaleToFill" /> </scroll-view> </view> </view> <view class="record-tool flex-column" v-if="questionItem.recordStatus !== 4" > <view class="hint" v-if="questionItem.recordStatus === 1" >点击开始录音</view > <view class="record-time" v-else>{{ audioTime }}</view> <view class="record-btn-wrap center" v-if="questionItem.recordStatus === 1" > <view class="switch" @click="changeRecodeStatus"> </view> </view> <view class="record-btn-wrap" v-else> <text @click="questionItem.recordStatus === 3 && handleRecode('delete')" v-if="questionItem.recordStatus >= 2" :class="{ active: questionItem.recordStatus === 3 }" >删除</text > <view class="switch" @click="changeRecodeStatus"> <image v-if="questionItem.recordStatus >= 2" :src=" questionItem.recordStatus === 2 ? playImgSrc : pauseImgSrc " :key="playIconKey" :style="{ 'margin-left': questionItem.recordStatus !== 2 ? '7rpx' : 0, width: '36rpx', height: '44rpx', }" mode="widthFix" /> </view> <text @click="handleRecode('finish')" v-if="questionItem.recordStatus >= 2" :class="{ active: questionItem.recordStatus >= 2 }" >完成</text > </view> </view> <view class="record-play" v-if="questionItem.recordStatus === 4"> <view class="audio-wrap"> <view v-if="pageLoading">音频生成中...</view> <view class="play" v-else> <van-icon :name="isplay ? 'pause' : 'play'" @click="handleAudioByReplay" color="#E6B77DFF" size="64rpx" style="align-items: flex-start; margin-left: -20rpx" /> <!-- 进度条 --> <view class="slider-box"> <slider :value="currentAudioMsg.audioCurrentTime" :max="currentAudioMsg.audioTime" @change="sliderChange($event)" @changing="sliderChanging" activeColor="#E6B77DFF" backgroundColor="#EBEBEBFF" block-color="#E6B77DFF" block-size="12" /> <view class="slider-time"> <text>{{ formatAudioTime(currentAudioMsg.audioCurrentTime * 1000) }}</text> <text>{{ formatAudioTime(currentAudioMsg.audioTime * 1000) }}</text> </view> </view> </view> </view> <view class="audio-delete" @click="handleRecode('delete')"> <image src="./static/delerecord.png" mode="heightFix" style="width: 32rpx; height: 35rpx" /> <text>删除</text></view > <view class="audio-pub" @click="handleRecode('pub')">发布</view> </view> </view> <view class="record-wrap flex-column" v-if="questionItem.reply_status === 2&&!isUserResearcher" > <view style="text-align: center;color: #999999;font-size: 32rpx;margin-top:100rpx;">该问题暂无回答,请等待研究员回答</view> </view> <view class="record-wrap flex-column" v-if="questionItem.reply_status===3&&isUserResearcher"> <view class="record-play" v-if="questionItem.recordStatus === 4"> <view class="audio-wrap"> <view class="play"> <van-icon :name="questionItem.community_question_id==curVoiceId&&!curAudioPaused ? 'pause' : 'play'" @click="handlePlayAudioByBg(questionItem)" color="#E6B77DFF" size="64rpx" style="align-items: flex-start; margin-left: -20rpx" /> <!-- 进度条 --> <view class="slider-box"> <slider :value="curTime" :max="currentAudioMsg.audioTime" @change="bgAudiosliderChange($event)" @changing="sliderChanging" activeColor="#E6B77DFF" backgroundColor="#EBEBEBFF" block-color="#E6B77DFF" block-size="12" /> <view class="slider-time"> <text>{{ formatAudioTime(curTime*1000) }}</text> <text>{{ formatAudioTime(questionItem.answer.audioTime * 1000) }}</text> </view> </view> </view> </view> <view class="audio-pub disable">已发布</view> <!-- 音频悬浮 --> <view v-show="false"> <audioBox v-if="showAudioPop"/> </view> </view> </view> </template> </template> <!-- 没有该问题权限 --> <template v-else-if="!hasAuth"> <view class="noAuth-wrap"> <image class="img" :src="globalImgUrls.activityNoAuth" mode="widthFix"></image> <view class="auth-text">您暂无权限查看问答社区</view> <view class="auth-text" v-if="noAuthInfo.type==='contact'">若想查看可以联系对口销售</view> <view class="auth-text" v-else>若想查看可以申请开通</view> <view class="auth-text" v-if="noAuthInfo.type==='contact'"> {{noAuthInfo.name||''}}:<text @click="handleCallPhone(noAuthInfo.mobile+'')">{{noAuthInfo.mobile||''}}</text> </view> <view class="global-btn-yellow-change btn" @click="handleGoApply" v-else>立即申请</view> </view> </template> <!-- 终止问答弹窗 --> <van-dialog use-slot title="终止问答" :show="stopQuestion.show" show-cancel-button confirm-button-open-type="getUserInfo" @close="stopQuestion.show=false;stopQuestion.reason=''" @confirm="handleConfirmStopQuestion" > <view style="padding:48rpx"> <textarea style="background: #F7F8FA;border-radius: 8px;padding: 20rpx;display:block;box-sizing:border-box;width:100%" maxlength="-1" cols="30" rows="10" placeholder="请输入终止理由" v-model="stopQuestion.reason" ></textarea> </view> </van-dialog> <!-- 转移问答弹窗 --> <removeQuestionDig :show="showRemoveQ" :qid="qid" @close="showRemoveQ=false" ></removeQuestionDig> </view> </template> <script> import mixin from "../mixin/questionMixin"; import { apiReplayAsk, apiGetQuestion, apiSetRead,apiCountAudioClick,apiQuestionStop } from "@/api/question"; import { apiApplyPermission} from '@/api/user'; import {apiGetSceneToParams} from "../api/common.js" import { uploadAudioToServer } from "@/utils/upload"; import audioBox from '@/components/audioBox/audioBox.vue' import removeQuestionDig from './components/removeQuestionDig.vue' export default { mixins: [mixin], components:{ audioBox, removeQuestionDig }, 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 }, curTime(){ let t=0 if(this.questionItem?.community_question_id==this.$store.state.audio.questionId){ t=this.$store.state.audio.curTime } return t } }, data() { return { qid:0, questionItem: null /* { recordStatus: 1, //1:未录音;2:正在录音;3:已暂停;4:完成录音 permission_info:{ type:'', name:'梁娜', mobile:'123456', customer_info:{ has_apply:false, company_name:'', name:'', status:'流失', } } }, */, pauseImgSrc: "../static/question/recordplay.png", playImgSrc: "../static/question/recordpause.png", innerAudio: null, //该页面的音频 audioCount: 0, //录音计时,毫秒 audioSrc:'',//tempSrc audioTime: "00:00", //录音时间(格式化后):string timer: null, audioItem: null, pageLoading: false, playIconKey: 0, isplay: false, isSlider: false, scrollTop:0, isStart:false,//判断录音是否开始 //globalRecorder:uni.getRecorderManager(), /* userInfo:{ is_inner:1,//0:外部客户;1内部员工 status:'正式', is_suspend:1, is_researcher:0, }, *///mock用户信息 stopQuestion:{ show:false, reason:'', },//终止问答 showRemoveQ:false,//展示转移问题弹窗 }; }, async onLoad(options) { this.initAudio(); let obj={} if(options.scene){ // 小程序码进来的 let res = await apiGetSceneToParams({scene_key:options.scene}) if(res.code==200){ obj=JSON.parse(res.data) } } this.qid=obj.id || options.id this.getQuestionItem(obj.id || options.id); }, onShow(){ uni.authorize({ scope: 'scope.record', success() { }, fail(e){ console.log('fail',e); } }) }, onUnload() { this.resetAudio(); this.destroyAudio(); //录音时误操作退出页面的情况 if(this.questionItem.recordStatus!==4&&this.questionItem.recordStatus!==1){ this.globalRecorder.stop() } }, //转发分享 onShareAppMessage(){ const {community_question_id} = this.questionItem return{ title:'问答详情', path:`/pages-question/answerDetail?id=${community_question_id}` } }, methods: { //初始化audio,onShow执行 initAudio() { this.innerAudio = uni.createInnerAudioContext(); this.handleAudioFun(); this.handleRecorderFun(); //录音完成后,切出其他页面再切回来 if(this.questionItem?.recordStatus===4){ console.log('count',this.audioCount,'src',this.audioSrc) this.setAudio(this.audioSrc,this.audioCount) } }, //录音完成or从其他app切回本页面时,初始化音频 setAudio(src,audioCount){ this.innerAudio.stop(); this.isplay = false; this.innerAudio.src = src; console.log('秒数',audioCount) this.changeCurrentAudio({ id: "", answer: { source: src, audioTime: audioCount/1000, }, }); }, //麦克风被占用,初始化录音相关变量 其他状态->未录音状态 setRecorder(){ this.questionItem.recordStatus = 1; this.innerAudio.stop(); this.isplay = false; this.audioItem = null; this.audioCount = 0; this.scrollTop = 0; this.audioTime = this.formatAudioTime(this.audioCount * 1000) }, //onHide触发 resetAudio(){ this.innerAudio.stop(); this.isplay = false; this.changeCurrentAudio({ id: '', answer: { source: '', audioTime: 0 } }) }, //audio事件 handleAudioFun() { this.innerAudio.onPlay(() => { this.isplay = true; console.log("播放录音了"); this.questionItem.loading = false; }); this.innerAudio.onTimeUpdate(() => { //console.log("时间更新", this.innerAudio.currentTime); /* this.currentAudioMsg.audioCurrentTime = parseInt( this.innerAudio.currentTime ); */ this.currentAudioMsg.audioCurrentTime = this.innerAudio.currentTime; }); this.innerAudio.onSeeked(() => { //取this.innerAudio.currentTime为0 console.log("seek完成"); this.isSlider = false; }); this.innerAudio.onPause(() => { this.isplay = false; console.log("暂停"); console.log(this.innerAudio.paused); }); this.innerAudio.onEnded(() => { console.log("音频播放完毕"); this.questionItem.answer.isplay = false; this.questionItem.answer.ispause = false; /* this.changeCurrentAudio({ id: "", answer: { source: "", audioTime: 0, }, }); */ this.currentAudioMsg.audioCurrentTime = 0; this.isplay = false; }); }, //录音事件 handleRecorderFun() { this.globalRecorder.onStart(() => { console.log("开始录音"); if(this.questionItem.recordStatus===1){ this.questionItem.recordStatus=2 } uni.hideToast(); this.clockTime(); }); this.globalRecorder.onPause(() => { console.log("暂停录音"); if(this.questionItem.recordStatus===2){ this.questionItem.recordStatus = 3 } this.cleanTime(); }); this.globalRecorder.onStop((res) => { console.log("录音完成"); //录音自动结束 和 暂停时点击删除 的情况 if (this.questionItem.recordStatus === 2) { this.questionItem.recordStatus = 4; } console.log('status',this.questionItem.recordStatus) console.log("res", JSON.stringify(res)); this.cleanTime(); //初始化音频播放 this.audioSrc = res.tempFilePath this.setAudio(this.audioSrc ,this.audioCount) this.pageLoading = false; }); this.globalRecorder.onError((res) => { console.log('err',res) console.log('errMsg',res.errMsg) /* uni.showToast({ title:res.errMsg, icon:'none' }) */ //开始录音失败 if(res.errMsg.includes('start')){ this.questionItem.recordStatus = 1; } //麦克风被占用的情况 if(res.errCode===1){ uni.showToast({ title:'麦克风被占用,已停止录音', icon:'none' }) this.globalRecorder.stop(); this.setRecorder() } }); /* this.globalRecorder.onFrameRecorded((res) => { console.log("?", res); }); */ }, async getQuestionItem(id) { const res = await apiGetQuestion({ question_id: id, }); if (res.code === 200) { this.questionItem = {...res.data,recordStatus:1}; const { audio_list } = res.data; let temp = {}; if (audio_list.length > 0) { temp = { source: res.data.audio_list[0].audio_url, audioTime: parseInt(res.data.audio_list[0].audio_play_seconds)||0, isplay: false, ispause: false, }; } else { temp = { source: "", audioTime: 0, isplay: false, ispause: false, }; } let readKey = ""; //const { is_inner } = this.userInfo; if (this.isUserResearcher) { readKey = "replier_is_read"; } else { readKey = "is_read"; } console.log('readKey',readKey) this.questionItem[readKey] !== 1 && (await apiSetRead({ question_ids: this.questionItem.community_question_id + "", })); this.questionItem.id = res.data.community_question_id; this.questionItem.answer = temp; this.questionItem.loading = false; this.questionItem.recordStatus = res.data.reply_status === 3 ? 4 : 1; //研究员查看已回复的问题,初始化音频 if(res.data.reply_status===3&&this.isUserResearcher){ this.innerAudio.src = res.data.audio_list[0].audio_url this.audioSrc = res.data.audio_list[0].audio_url this.audioCount = parseInt(res.data.audio_list[0].audio_play_seconds)*1000 this.changeCurrentAudio({ id: "", answer: { source: res.data.audio_list[0].audio_url, audioTime: parseInt(res.data.audio_list[0].audio_play_seconds)||0, }, }); } }else if(res.code===403){ this.hasAuth=false this.noAuthInfo = res.data }else{ //问题被删除的情况,返回小程序首页 setTimeout(()=>{ uni.switchTab({ url:'/pages/report/report' }); },1000) } }, changeRecodeStatus() { console.log('a',this.questionItem.recordStatus) //根据questionItem.recordStatus if (this.questionItem.recordStatus === 1) { const that = this //检查是否有权限 uni.getSetting({ success(res){ console.log('res',res) if(res.authSetting['scope.record']){ that.startRecord() }else{ that.getRecordAuth() } } }); } else if (this.questionItem.recordStatus === 2) { //暂停录音 this.globalRecorder.pause(); this.questionItem.recordStatus = 3; } else if (this.questionItem.recordStatus === 3) { //继续录音 this.globalRecorder.resume(); this.clockTime(); this.questionItem.recordStatus = 2; } else { //结束录音 this.globalRecorder.stop(); //this.cleanTime(); } }, //获取录音授权 getRecordAuth(){ const {community_question_id} = this.questionItem uni.openSetting({ success(res){ //刷新页面 if(res.authSetting['scope.record']){ uni.redirectTo({url: `/pages-question/answerDetail?id=${community_question_id}`}) } } }) //this.questionItem.recordStatus = 1 }, //开启录音 startRecord(){ console.log(this.globalRecorder) this.globalRecorder.start({ duration: 180000, format: "mp3" }); uni.showToast({ title:'加载中', icon:'loading' }) this.questionItem.recordStatus = 2; }, //上传音频 async uploadAudio() { const res = await uploadAudioToServer(this.innerAudio.src); if (res.code === 200) { this.audioItem = res.data; } else { //重新录 this.setRecorder() } }, //录音操作:完成/删除/发布 async handleRecode(type) { if (type==='finish') { this.questionItem.recordStatus = 4; this.changeRecodeStatus(); } if (type === "finish") { //生成音频,更改页面布局 this.pageLoading = true; } else if (type === "delete") { //重新录 if(this.questionItem.recordStatus===3)this.globalRecorder.stop(); this.setRecorder() } else { //发布 if (!this.audioItem) { await this.uploadAudio(); } //如果上传音频成功 if (this.questionItem.recordStatus === 4) { //发布回答 const res = await apiReplayAsk({ question_id: this.questionItem.community_question_id, audio_list: [{ ...this.audioItem, sort: 1 }], }); if (res.code === 200) { uni.showToast({ title: "发布成功", icon: "success", duration: 500, }); setTimeout(() => { //关闭当前页面,跳转到我的回答 // 返回失败 从公众号模板消息过来的,导航至我的问答 uni.navigateBack({ delta: 1 , fail:()=>{ uni.redirectTo({ url: '/pages-question/answerList' }) } }); }, 500); } } } }, //(提问者)问题已被回答,点击回答音频 handleAudio(item) { const { source, isplay, ispause } = item.answer; if (isplay) { //说明是播放->暂停 this.innerAudio.pause(); this.questionItem.answer.isplay = false; this.questionItem.answer.ispause = true; } else if (ispause) { //说明是暂停->播放 this.innerAudio.play(); this.questionItem.answer.isplay = true; this.questionItem.answer.ispause = false; } else { //console.log("aaa", source, this.innerAudio.src); //说明是第一次播放或播放完 this.changeCurrentAudio(item); this.innerAudio.stop(); this.innerAudio.src = source; this.handleAudioPlay(); this.questionItem.answer.isplay = true; //音频点击次数+1 const audio_id = this.questionItem.audio_list[0].community_question_audio_id apiCountAudioClick({ community_question_audio_id:audio_id, source_agent:1 }).then((res)=>{ if(res.code===200){ console.log('音频id为'+audio_id+'点击次数+1') } }) } }, //(回答者)问题被回答,点击回答音频 handleAudioByReplay() { this.isplay = !this.isplay; if (this.innerAudio.paused) { this.innerAudio.play(); } else { this.innerAudio.pause(); } this.playIconKey++; //更新音频播放图标 }, //拖动音频进度条 sliderChange(e) { console.log("拖动完成?"); //this.innerAudio.pause(); const value = e.detail.value; this.innerAudio.seek(value); this.currentAudioMsg.audioCurrentTime = value; }, sliderChanging() { this.isSlider = true; }, // 背景音频播放的拖动 bgAudiosliderChange(e){ const value=e.detail.value this.globalBgMusic.seek(value) }, //切换当前播放音频 changeCurrentAudio(item) { const { id } = item; const { source, audioTime } = item.answer; this.currentAudioMsg = { id: id, audioCurrentTime: 0 * 1000, audioTime: audioTime, audioCurrentUrl: source, }; if (id) { this.questionItem.loading = true; } }, //录音计时 clockTime() { console.log("开始录音计时"); if(this.timer) return this.timer = setInterval(() => { if (this.timer) { this.audioCount += 30; this.audioTime = this.formatAudioTime(this.audioCount) this.scrollTop+=1; } }, 30); }, //清除录音计时 cleanTime() { console.log("结束录音计时"); clearInterval(this.timer); this.timer=null this.playIconKey++; //更新录音暂停播放图标 //this.audioTime = this.dayjs(this.audioCount).format("mm:ss.SS"); }, //scroll-view滑动到最右 handleScrolltolower(){ console.log('a',this.scrollTop) this.scrollTop-=150; }, //权限相关 handleContact(mobile){ uni.makePhoneCall({ phoneNumber: mobile+'' }); }, async handleGoApply(){ const {customer_info} = this.questionItem.permission_info const {community_question_id} = this.questionItem if (customer_info.has_apply) { //已经申请过 uni.showToast({ title:'您已提交过申请,请耐心等待', icon:'none' }) } else { if (!customer_info.status || customer_info.status != '流失'|| customer_info.status != '关闭') { uni.navigateTo({ url: "/pages-applyPermission/applyPermission?source=5&form_page=问答社区" }) } else { //主动调一次申请权限接口 const res = await apiApplyPermission({ company_name: customer_info.company_name, real_name: customer_info.name, source: 5, from_page: '问答社区' }) if (res.code === 200) { uni.showToast({ title:'您已提交过申请,请耐心等待', icon:'none' }) uni.redirectTo({url: `/pages-question/answerDetail?id=${community_question_id}`}) } } } }, // 终止问答 async handleConfirmStopQuestion(){ console.log('stop question'); if(!this.stopQuestion.reason){ uni.showToast({ title:"请填写终止理由", icon:"none" }) return } const res=await apiQuestionStop({ community_question_id:this.questionItem.community_question_id, reason:this.stopQuestion.reason }) if(res.code===200){ uni.showToast({ title:"成功终止", icon:"success" }) setTimeout(() => { uni.navigateBack({ delta:1, fail(){ uni.switchTab({ url: '/pages/question/question' }) } }) }, 1500); } } }, }; </script> <style scoped lang="scss"> .flex-column { display: flex; flex-direction: column; } .answerdetail-page { padding: 50rpx 30rpx 0 30rpx; height: calc(100vh - calc(50px + env(safe-area-inset-bottom))); box-sizing: border-box; .question-wrap { .question-item::after { height: 0; } } .record-wrap { margin: 0 -30rpx; flex: 1; .record { flex: 1; justify-content: center; align-items: center; .no-record { text-align: center; color: #999999ff; font-size: 28rpx; // height:130rpx; image { width: 94rpx; } .black-btn{ width: 100%; height: 80rpx; line-height: 80rpx; background: #333333; box-shadow: 0px 4rpx 20rpx rgba(160, 126, 84, 0.25); border-radius: 40rpx; color: #E3B377; text-align: center; font-size: 32rpx; } } /* .record-time { justify-self: flex-end; font-size: 60rpx; } */ .recode-image { width: 100%; height: 100%; background-color: #fafafaff; display: flex; align-items: center; .scroll-view { width: 100%; white-space: nowrap; ::-webkit-scrollbar{ width:0; height:0; display:none; color:transparent; } image { width: 421rpx; height: 100rpx; margin-right: 6rpx; } } } } .record-tool { justify-content: center; align-items: center; border-top: 1rpx solid #e6e6e6ff; height: 400rpx; position: relative; .hint { color: #ee3636ff; font-size: 28rpx; position: absolute; top: 50rpx; } .record-time{ font-size: 60rpx; } .record-btn-wrap { margin-top: 38rpx; display: flex; width: 100%; justify-content: space-around; align-items: center; &.center { justify-content: center; } text { color: #999999ff; font-size: 32rpx; &.active { color: #ee3636ff; } } .switch { width: 118rpx; height: 118rpx; padding: 12rpx; box-sizing: border-box; border-radius: 50%; border: 1rpx solid #ee3636ff; /* background-color: rgb(68, 46, 46); */ position: relative; display: flex; align-items: center; justify-content: center; image { position: absolute; width: 36rpx; z-index: 5; } &::after { content: ""; display: inline-block; width: 100%; height: 100%; border-radius: 50%; background-color: #ee3636ff; } } } } .record-play { margin: 20rpx 30rpx; .audio-wrap { background-color: #fdf8f2ff; padding: 30rpx; border-radius: 16rpx; } .play { display: flex; justify-content: space-between; .slider-box { margin-left: 15rpx; flex: 1; slider { margin: 15rpx 0 0 0; } .slider-time { display: flex; justify-content: space-between; text { color: #999999ff; font-size: 22rpx; } } } } .audio-delete { margin-top: 20rpx; width: 100%; height: 40rpx; display: flex; justify-content: flex-end; align-items: center; image { height: 40rpx; } text { margin-left: 10rpx; color: #999999ff; font-size: 28rpx; } } .audio-pub { margin-top: 120rpx; background-color: #e6b77dff; color: #fff; height: 80rpx; line-height: 80rpx; border-radius: 40rpx; text-align: center; position: relative; width: 390rpx; left: 50%; margin-left: -170rpx; &.disable{ background-color:#999999ff; color: #fff; } } } } } </style>