detail.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. <template>
  2. <view class="activity-detail" v-if="info">
  3. <view
  4. class="top-wrap"
  5. :style="'background-image:url(' + info.speakerBackgroundPic + ')'"
  6. >
  7. <view class="status status-before" v-if="info.activityState === 1"
  8. >未开始</view
  9. >
  10. <view class="status status-before" v-if="info.activityState === 2"
  11. >进行中</view
  12. >
  13. <view class="status status-before" v-if="info.activityState === 3"
  14. >已结束</view
  15. >
  16. <view class="title">{{ info.activityTypeName }}</view>
  17. <view class="name">主讲人:{{ info.speaker }}</view>
  18. <view class="time"
  19. >活动时间:{{
  20. info.startTime | formatActivityTime(info.endTime)
  21. }}</view
  22. >
  23. <view class="flex city" v-if="info.city">
  24. <image src="./static/position.png" model="aspectFill"></image>
  25. <text>{{ info.city }}</text>
  26. </view>
  27. </view>
  28. <view class="intro-wrap">{{ info.reportName?info.reportName.split('】')[1]:info.activityName }}</view>
  29. <!-- 音频 -->
  30. <view class="audio-wrap" v-if="info.activityState === 3">
  31. <view
  32. class="audio-item"
  33. v-for="(item,index) in audioList"
  34. :key="item.voiceUrl"
  35. @click="handleClickAudioItem(item)"
  36. >
  37. <!-- <image
  38. class="icon"
  39. src="../static/audio-doing.png"
  40. mode="aspectFill"
  41. v-if="activeAudioUrl==item.voiceUrl&&audioPlayStatus==true"
  42. />
  43. <image
  44. class="icon"
  45. src="../static/audio-pause-3.png"
  46. mode="aspectFill"
  47. v-else-if="activeAudioUrl==item.voiceUrl&&audioPlayStatus==false"
  48. />
  49. <image
  50. class="icon"
  51. src="../static/audio-pause-2.png"
  52. model="aspectFill"
  53. v-else
  54. /> -->
  55. <view class="name" :style="{color:item.voiceUrl==activeAudioUrl?'#D5AD79':''}">{{ item.voiceName }}</view>
  56. <view class="time">{{ item.voicePlaySeconds|formatVoiceTime }}</view>
  57. </view>
  58. <view class="box" v-if="activeAudioUrl">
  59. <view class="flex top-slider">
  60. <text>{{audioCurrentTime|formatVoiceTime}}</text>
  61. <slider
  62. class="audio-slider"
  63. activeColor="#e3b377"
  64. :max="activeAudioTime"
  65. :value="audioCurrentTime"
  66. @change="handleAudioSliderChange($event)"
  67. block-size="20"
  68. />
  69. <text>{{activeAudioTime|formatVoiceTime}}</text>
  70. </view>
  71. <view class="flex btns">
  72. <image
  73. class="before"
  74. :src="isFirstAudio?'../static/audio-before-grey.png':'../static/audio-before.png'"
  75. mode="aspectFit"
  76. @click="handleAudioBtn('before')"
  77. />
  78. <image
  79. class="center"
  80. :src="audioPlayStatus?'../static/audio-doing.png':'../static/audio-pause-3.png'"
  81. mode="aspectFit"
  82. @click="handleAudioBtn('center')"
  83. />
  84. <image
  85. class="next"
  86. :src="isLastAudio?'../static/audio-before-grey.png':'../static/audio-before.png'"
  87. mode="aspectFit"
  88. @click="handleAudioBtn('next')"
  89. />
  90. </view>
  91. </view>
  92. </view>
  93. <view class="info-wrap">
  94. <view
  95. class="flex item"
  96. v-for="item in infoList"
  97. :key="item.label"
  98. @click="handleClickInfoItem(item)"
  99. >
  100. <view class="label">{{ item.label }}:</view>
  101. <view :class="['content', item.color && 'yellow-color',item.type=='copy'&&'link']">
  102. {{item.text}}
  103. </view>
  104. <view class="copy-btn" v-if="item.type == 'copy'" @click="handleCopyLink(item.text)">复制链接</view>
  105. </view>
  106. </view>
  107. <!-- 报告链接 -->
  108. <view class="info-wrap" v-if="info.reportLink">
  109. <view class="flex item" @click="handleOpenReport">
  110. <view class="label">相关报告:</view>
  111. <view class="yellow-color">查看报告链接</view>
  112. </view>
  113. </view>
  114. <view class="btn-wrap" v-if="info.activityState === 1">
  115. <view
  116. :class="[info.registerState == 1?'global-btn-disable':'global-btn-yellow-change' ,'btn']"
  117. v-if="info.firstActivityTypeId === 3"
  118. @click="handleSetRegister"
  119. >{{
  120. info.registerState == 0
  121. ? "报名线下参会"
  122. : "取消报名线下参会"
  123. }}({{ info.registeredNum>info.limitPeopleNum?info.limitPeopleNum:info.registeredNum }}/{{ info.limitPeopleNum }})</view
  124. >
  125. <view
  126. :class="[
  127. info.hasRemind == 1
  128. ? 'global-btn-disable'
  129. : 'global-btn-yellow-change',
  130. 'btn',
  131. ]"
  132. @click="handleSetRemind"
  133. >{{ info.hasRemind == 1 ? "取消会议提醒" : "会议提醒" }}</view
  134. >
  135. <p class="tips">(会前15分钟推送微信消息提醒)</p>
  136. </view>
  137. <!-- 弹窗 -->
  138. <van-popup :show="pupData.show" @close="pupData.show = false" :close-on-click-overlay="false">
  139. <view class="global-pup">
  140. <view class="content">
  141. <rich-text :nodes="pupData.content"></rich-text>
  142. </view>
  143. <view class="flex bot" v-if="pupData.type == 'contact'">
  144. <view @click="pupData.show = false" style="color: #a9afb8">取消</view>
  145. <view @click="handleCallPhone(pupData.mobile)">拨号</view>
  146. </view>
  147. <view class="flex bot" v-else-if="pupData.type == 'apply'">
  148. <view @click="pupData.show = false" style="color: #a9afb8">取消</view>
  149. <view @click="handleApply">立即申请</view>
  150. </view>
  151. <view class="flex bot" v-else>
  152. <view @click="pupData.show = false">知道了</view>
  153. </view>
  154. </view>
  155. </van-popup>
  156. </view>
  157. </template>
  158. <script>
  159. // 活动详情
  160. import {
  161. apiActivityDetail,
  162. apiActivityAudios,
  163. apiActivityAddRemind,
  164. apiActivityCancelRemind,
  165. apiActivityRegister,
  166. apiActivityCancelRegister
  167. } from "@/api/activity";
  168. import {baseApiUrl} from '@/utils/config.js'
  169. export default {
  170. name: "ActivityDetail",
  171. computed: {
  172. isFirstAudio(){
  173. if(this.audioList.length>0){
  174. return this.activeAudioUrl==this.audioList[0].voiceUrl
  175. }
  176. },
  177. isLastAudio(){
  178. if(this.audioList.length>0){
  179. return this.activeAudioUrl==this.audioList[this.audioList.length-1].voiceUrl
  180. }
  181. },
  182. },
  183. data() {
  184. return {
  185. id: 0, //活动id
  186. infoList: [],
  187. info: null,
  188. audioList: [], //音频数据
  189. activeAudioUrl:'',//正在播放的背景音频地址
  190. activeAudioTime:0,//选择的音频数据时长
  191. audioCurrentTime:0,//音频正常播放的时间
  192. audioPlayStatus:false,//音频是否正在播放
  193. pupData: {
  194. show: false,
  195. content: "", //弹窗html字符串
  196. type: "",
  197. mobile: "",
  198. },
  199. };
  200. },
  201. onLoad(options) {
  202. this.id = options.id;
  203. this.getDetail();
  204. this.getAudios()
  205. },
  206. onUnload(){
  207. // 存一次
  208. const tag=this.audioList.some(item=>item.voiceUrl==this.globalBgMusic.src)
  209. if(tag){
  210. let obj={
  211. activityId:this.id,//活动id
  212. play:this.audioPlayStatus,//是否正在播放
  213. list:this.audioList,//音频列表数据
  214. show:false,//是否显示弹窗
  215. title:this.info.activityTypeName,//音频弹窗标题
  216. audioCurrentTime:this.audioCurrentTime,//音频播放实时时间
  217. audioTime:this.activeAudioTime,//当前音频时间
  218. audioCurrentUrl:this.activeAudioUrl,//当前音频地址
  219. }
  220. uni.setStorageSync('audioMsg', JSON.stringify(obj))
  221. }
  222. },
  223. onShareAppMessage() {
  224. let title=''
  225. if(this.info.firstActivityTypeId==1){
  226. title=this.info.reportName.split('】')[1]||this.info.activityName
  227. }else{
  228. title=this.info.activityName
  229. }
  230. const token=uni.getStorageSync('token')
  231. let imgUrl=baseApiUrl+`/activity/getActivityShareImg?activity_id=${this.id}`
  232. return {
  233. title: title,
  234. imageUrl:imgUrl
  235. }
  236. },
  237. methods: {
  238. // 点击音频项
  239. handleClickAudioItem(item){
  240. // 点击同一个音频
  241. if(item.voiceUrl==this.activeAudioUrl){
  242. // if(this.audioPlayStatus){
  243. // this.globalBgMusic.pause()
  244. // }else{
  245. // this.globalBgMusic.play()
  246. // }
  247. }else{
  248. this.handlePlayAudio(item)
  249. }
  250. },
  251. // 播放音频
  252. handlePlayAudio(e){
  253. console.log(e);
  254. this.globalBgMusic.title=e.voiceName
  255. this.globalBgMusic.src=e.voiceUrl
  256. this.globalBgMusic.onCanplay(()=>{
  257. console.log('onCanplay');
  258. this.globalBgMusic.play()
  259. this.activeAudioUrl=e.voiceUrl
  260. this.activeAudioTime=e.voicePlaySeconds
  261. })
  262. this.handleAudioFun()
  263. },
  264. // 音频事件
  265. handleAudioFun(){
  266. this.globalBgMusic.onPlay(()=>{
  267. console.log('onplay');
  268. this.audioPlayStatus=true
  269. })
  270. this.globalBgMusic.onPause(()=>{
  271. console.log('onPause');
  272. this.audioPlayStatus=false
  273. })
  274. this.globalBgMusic.onStop(()=>{
  275. console.log('onStop');
  276. this.audioPlayStatus=false
  277. this.activeAudioUrl=''
  278. this.activeAudioTime=0
  279. this.audioCurrentTime=0
  280. })
  281. this.globalBgMusic.onEnded(()=>{
  282. console.log('onEnded');
  283. this.audioPlayStatus=false
  284. this.handleAudioBtn('next','auto')
  285. })
  286. this.globalBgMusic.onError((e)=>{
  287. console.log('onError',e);
  288. uni.showToast({
  289. title:"音频播放错误",
  290. icon:'none'
  291. })
  292. })
  293. this.globalBgMusic.onTimeUpdate(()=>{
  294. if(this.globalBgMusic.src==this.activeAudioUrl){
  295. this.audioCurrentTime=parseInt(this.globalBgMusic.currentTime)
  296. }
  297. })
  298. },
  299. // 点击播放按钮
  300. handleAudioBtn(type,e){
  301. if(type==='center'){
  302. if(this.globalBgMusic.src){
  303. if(this.audioPlayStatus){
  304. this.globalBgMusic.pause()
  305. }else{
  306. this.globalBgMusic.play()
  307. }
  308. }else{
  309. this.handlePlayAudio(this.audioList[0])
  310. }
  311. }
  312. if(type==='before'){
  313. if(!this.isFirstAudio){
  314. this.audioList.forEach((_item,index)=>{
  315. if(_item.voiceUrl==this.activeAudioUrl){
  316. this.handlePlayAudio(this.audioList[index-1])
  317. }
  318. })
  319. }
  320. }
  321. if(type==='next'){
  322. if(!this.isLastAudio){
  323. this.audioList.forEach((_item,index)=>{
  324. if(_item.voiceUrl==this.activeAudioUrl){
  325. this.handlePlayAudio(this.audioList[index+1])
  326. }
  327. })
  328. }else{
  329. // 自动播放最后一个结束
  330. if(e==='auto'){
  331. this.activeAudioUrl=''
  332. this.audioPlayStatus=false
  333. this.activeAudioTime=0
  334. this.audioCurrentTime=0
  335. }
  336. }
  337. }
  338. },
  339. //音频进度条拖动
  340. handleAudioSliderChange(e){
  341. const value=e.detail.value
  342. this.globalBgMusic.seek(value)
  343. },
  344. // 获取活动音频
  345. async getAudios() {
  346. const res = await apiActivityAudios({ activity_id: Number(this.id) });
  347. if (res.code === 200&&res.data) {
  348. this.audioList = res.data
  349. let obj=uni.getStorageSync('audioMsg')
  350. if(obj){
  351. if(this.globalBgMusic.src&&JSON.parse(obj).activityId==this.id){
  352. this.activeAudioUrl=JSON.parse(obj).audioCurrentUrl
  353. this.activeAudioTime=Number(JSON.parse(obj).audioTime)
  354. this.audioCurrentTime=parseInt(this.globalBgMusic.currentTime)
  355. this.audioPlayStatus=JSON.parse(obj).play
  356. this.handleAudioFun()
  357. }
  358. }
  359. }
  360. },
  361. async getDetail() {
  362. const res = await apiActivityDetail({ activity_id: Number(this.id) });
  363. // 无权限
  364. if (res.code === 403) {
  365. uni.redirectTo({
  366. url: "/pages-activity/noAuthority?data=" + JSON.stringify(res.data),
  367. });
  368. return;
  369. }
  370. if (res.code === 200) {
  371. this.info = res.data;
  372. let arr = [
  373. {
  374. label: "大陆拨号",
  375. text: res.data.mainlandTel,
  376. color: "yellow",
  377. type: "tel",
  378. },
  379. {
  380. label: "香港拨入",
  381. text: res.data.hongKongTel,
  382. color: "yellow",
  383. type: "tel",
  384. },
  385. {
  386. label: "台湾拨入",
  387. text: res.data.taiwanTel,
  388. color: "yellow",
  389. type: "tel",
  390. },
  391. {
  392. label: "新加坡拨入",
  393. text: res.data.singaporeTel,
  394. color: "yellow",
  395. type: "tel",
  396. },
  397. {
  398. label: "美国拨入",
  399. text: res.data.americaTel,
  400. color: "yellow",
  401. type: "tel",
  402. },
  403. {
  404. label: "拨入密码",
  405. text: res.data.participationCode,
  406. },
  407. ];
  408. this.infoList = arr.filter((item) => {
  409. return item.text;
  410. });
  411. // 研究员线下沙龙
  412. if (res.data.firstActivityTypeId === 3) {
  413. // this.infoList.push({label: "活动地址",text: res.data.city + res.data.address})
  414. if(res.data.linkParticipants){
  415. this.infoList.push({label: "网络参会",text: res.data.linkParticipants,color: "yellow",type: "copy"})
  416. }
  417. }
  418. }
  419. },
  420. // 点击信息项
  421. handleClickInfoItem(e) {
  422. if (e.type === "tel" && e.text) {
  423. uni.makePhoneCall({
  424. phoneNumber: e.text,
  425. });
  426. }
  427. },
  428. // 跳转webview 打开报告
  429. handleOpenReport() {
  430. uni.navigateTo({
  431. url: "/pages-activity/reportDetail",
  432. success:(res)=>{
  433. res.eventChannel.emit('webUrl', { url: this.info.reportLink})
  434. }
  435. });
  436. },
  437. // 复制链接
  438. handleCopyLink(text){
  439. uni.setClipboardData({
  440. data: text,
  441. success: function () {
  442. uni.showToast({
  443. title:"复制成功,可在浏览器内打开",
  444. icon:"none"
  445. })
  446. },
  447. fail:function(){
  448. uni.showToast({
  449. title:"复制失败",
  450. icon:"none"
  451. })
  452. }
  453. });
  454. },
  455. // 设置会议提醒
  456. async handleSetRemind() {
  457. if (this.info.hasRemind == 1) {
  458. this.handleCancelRemind();
  459. } else {
  460. this.handleAddRemind();
  461. }
  462. },
  463. // 添加提醒
  464. async handleAddRemind() {
  465. const res = await apiActivityAddRemind({ activity_id: Number(this.info.activityId) });
  466. if (res.code === 200) {
  467. this.pupData.content = `<h4 style="text-align:center;margin-bottom:5px">设置成功</h4>
  468. <p>关注【弘则研究】公众号,接收会前15分钟微信提醒,并及时获取活动信息变更通知</p>`;
  469. this.pupData.show = true;
  470. this.handleUpateRemindStatus();
  471. } else if (res.code === 4001) {
  472. if (res.data.type == "time") {
  473. this.pupData.content = `<p>会议开始前15分钟内无法设置会议提醒</p>`;
  474. this.pupData.type = "time";
  475. }
  476. this.pupData.show = true;
  477. }
  478. },
  479. //取消提醒
  480. async handleCancelRemind() {
  481. const res = await apiActivityCancelRemind({ activity_id: Number(this.info.activityId) });
  482. if (res.code === 200) {
  483. uni.showToast({
  484. title: "取消提醒成功",
  485. icon: "none",
  486. });
  487. this.handleUpateRemindStatus();
  488. }else if(res.code===403){
  489. uni.showToast({
  490. title:res.msg,
  491. icon:"none"
  492. })
  493. }
  494. },
  495. // 更新列表提醒状态
  496. handleUpateRemindStatus() {
  497. if (this.info.hasRemind == 1) {
  498. this.info.hasRemind = 0
  499. } else {
  500. this.info.hasRemind = 1
  501. }
  502. uni.$emit('activityDetailSetRemind', { id: this.info.activityId })
  503. },
  504. // 设置报名
  505. handleSetRegister() {
  506. if (this.info.registerState == 1) {
  507. this.handleCancelRegister();
  508. } else {
  509. this.handleAddRegister();
  510. }
  511. },
  512. // 线下报名
  513. async handleAddRegister() {
  514. const res = await apiActivityRegister({ activity_id: Number(this.info.activityId) })
  515. if (res.code === 200) {
  516. this.pupData.content = `<h4 style="text-align:center;margin-bottom:5px">报名成功</h4>
  517. <p>关注【弘则研究】公众号,接收会前1小时微信提醒,并及时获取活动信息变更通知</p>`
  518. this.pupData.show = true
  519. this.handleUpdateRegister()
  520. } else if (res.code === 4001) {
  521. if (res.data.type == 'time') {
  522. this.pupData.content = `<p>活动开始前15分钟内无法设置会议提醒</p>`
  523. this.pupData.type = 'time'
  524. } else if (res.data.type == 'full') {
  525. this.pupData.content = `<p>此活动报名人数已满,请留意下期活动</p>`
  526. this.pupData.type = 'full'
  527. }
  528. this.pupData.show = true
  529. }
  530. },
  531. //取消线下报名
  532. async handleCancelRegister() {
  533. const res = await apiActivityCancelRegister({ activity_id: Number(this.info.activityId) })
  534. if (res.code === 200) {
  535. uni.showToast({
  536. title: "取消报名成功",
  537. icon: "none"
  538. })
  539. this.handleUpdateRegister()
  540. }else if(res.code===403){
  541. uni.showToast({
  542. title:res.msg,
  543. icon:"none"
  544. })
  545. }
  546. },
  547. //更新列表报名状态
  548. handleUpdateRegister() {
  549. if (this.info.registerState == 1) {
  550. this.info.registerState = 0
  551. } else {
  552. this.info.registerState = 1
  553. }
  554. this.getDetail()
  555. uni.$emit('activityDetailSetRegister', { id: this.info.activityId })
  556. }
  557. },
  558. };
  559. </script>
  560. <style lang="scss">
  561. .activity-detail {
  562. background: #fff;
  563. }
  564. .top-wrap {
  565. width: 100%;
  566. height: 370rpx;
  567. // background: linear-gradient(
  568. // 312deg,
  569. // rgba(0, 0, 0, 0.8) 0%,
  570. // rgba(43, 43, 43, 0.8) 100%
  571. // );
  572. background-color: #666666;
  573. color: $global-text-color-white;
  574. padding-top: 144rpx;
  575. padding-left: 40rpx;
  576. padding-right: 40rpx;
  577. background-size: cover;
  578. background-repeat: no-repeat;
  579. position: relative;
  580. .status {
  581. position: absolute;
  582. top: 0;
  583. left: 0;
  584. width: 116rpx;
  585. line-height: 44rpx;
  586. border-radius: 0px 0px 16rpx 0px;
  587. color: $global-text-color-white;
  588. text-align: center;
  589. font-size: $global-font-size-sm;
  590. }
  591. .status-before {
  592. background-color: #e3b377;
  593. }
  594. .status-progress {
  595. background-color: #3385ff;
  596. }
  597. .status-end {
  598. background-color: #a2a2a2;
  599. }
  600. .title {
  601. font-size: 19px;
  602. font-weight: bold;
  603. }
  604. .name {
  605. margin-top: 15rpx;
  606. margin-bottom: 40rpx;
  607. }
  608. .time {
  609. opacity: 0.8;
  610. font-size: $global-font-size-sm;
  611. }
  612. .city {
  613. font-size: $global-font-size-sm;
  614. align-items: center;
  615. position: absolute;
  616. right: 40rpx;
  617. bottom: 59rpx;
  618. image {
  619. width: 32rpx;
  620. height: 32rpx;
  621. }
  622. }
  623. }
  624. .intro-wrap {
  625. background-color: #fff;
  626. box-shadow: 0px 3px 12px rgba(196, 196, 196, 0.16);
  627. font-size: $global-font-size-lg;
  628. font-weight: bold;
  629. padding: 28rpx 34rpx;
  630. }
  631. .info-wrap {
  632. padding: 30rpx 34rpx;
  633. .item {
  634. margin-bottom: 30rpx;
  635. .label {
  636. flex-shrink: 0;
  637. }
  638. .copy-btn {
  639. background-color: #e3b377;
  640. color: #fff;
  641. padding: 4rpx 8rpx;
  642. font-size: 12px;
  643. margin-left: 4rpx;
  644. }
  645. .link{
  646. width: 300rpx;
  647. white-space:nowrap;
  648. overflow:hidden;
  649. text-overflow:ellipsis;
  650. }
  651. }
  652. .yellow-color {
  653. color: $global-text-color-main;
  654. }
  655. }
  656. .audio-wrap {
  657. padding: 0 34rpx;
  658. .audio-item {
  659. padding: 36rpx 0;
  660. border-bottom: 1px solid #E8DED2;
  661. position: relative;
  662. .icon {
  663. position: absolute;
  664. top: 50rpx;
  665. right: 6rpx;
  666. width: 48rpx;
  667. height: 48rpx;
  668. }
  669. .name {
  670. margin-bottom: 10rpx;
  671. }
  672. .time {
  673. font-size: $global-font-size-mini;
  674. }
  675. .audio-slider{
  676. margin: 20rpx 0 20rpx 20rpx;
  677. }
  678. }
  679. .box{
  680. min-height: 100rpx;
  681. margin-top: 60rpx;
  682. margin-bottom: 70rpx;
  683. padding: 30rpx 20rpx;
  684. background: #FFFFFF;
  685. border: 1px solid rgba(240, 234, 226, 0.3);
  686. box-shadow: 0px 3px 12px rgba(154, 154, 154, 0.16);
  687. border-radius: 16px;
  688. .top-slider{
  689. align-items: center;
  690. text{
  691. width: 110rpx;
  692. font-size: 12px;
  693. text-align: center;
  694. flex-shrink: 0;
  695. }
  696. .audio-slider{
  697. flex: 1;
  698. margin: 0 20rpx;
  699. }
  700. }
  701. .btns{
  702. justify-content: space-between;
  703. width: 50%;
  704. align-items: center;
  705. margin-left: auto;
  706. margin-right: auto;
  707. margin-top: 25rpx;
  708. image{
  709. width: 58rpx;
  710. height: 58rpx;
  711. }
  712. .next{
  713. transform: rotate(180deg);
  714. }
  715. }
  716. }
  717. }
  718. .btn-wrap {
  719. .btn {
  720. width: 380rpx;
  721. line-height: 70rpx;
  722. margin-left: auto;
  723. margin-right: auto;
  724. margin-top: 40rpx;
  725. }
  726. .tips {
  727. font-size: $global-font-size-sm;
  728. color: $global-text-color-999;
  729. text-align: center;
  730. }
  731. }
  732. </style>