activityDetail.vue 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. <template>
  2. <block>
  3. <view class="container activity-detail" v-if="isUserBindingPhoneNumber">
  4. <is-track-follow :isShowFollowButton.sync="detailData.IsShowFollowButton" source="activity" :sourceId="detailData.ActivityId" :isFollowData.sync="detailData.IsFollowButton" />
  5. <view class="" v-if="haveAuth == 1">
  6. <block v-if="detailData.YidongActivityUrl">
  7. <web-view :src="detailData.YidongActivityUrl"></web-view>
  8. </block>
  9. <block v-else>
  10. <!-- 头部滚动显示 -->
  11. <view class="notice" v-if="detailData.IsLimitPeople">
  12. <van-notice-bar color="#FFFFFF" background="#FE9000" text="该活动参与名额有限,报名客户请按时参加,若不能按时参加请及时取消报名,爽约会影响您的后续报名资格" />
  13. </view>
  14. <!-- 内容部分 -->
  15. <view class="content">
  16. <view v-if="detailData.ActivityName" class="dialog-title brackets-title">
  17. <image v-if="detailData.IsResearchPoints" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/Research_Points.png"></image>
  18. <image v-if="!detailData.IsResearchPoints && detailData.TemporaryLabel" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"></image>
  19. {{ detailData.ActivityName }}
  20. </view>
  21. <block v-if="detailData.FileType == 1">
  22. <view class="audio-card" v-if="detailData.VoiceList && detailData.VoiceList.Url">
  23. <view class="slider-paly">
  24. <view style="flex: 1; padding-top: 20rpx">
  25. <slider
  26. activeColor="#3385FF"
  27. :max="detailData.VoiceList.PlaySeconds"
  28. :value="curTime"
  29. @touchstart="touchstartHandler"
  30. @change="handleAudioSliderChange($event)"
  31. @changing="handleAudioSliderChangeing($event)"
  32. block-size="16"
  33. class="slider"
  34. />
  35. <view class="card-time">
  36. <view class="time">{{ curTime | formatVoiceTime }}</view>
  37. <view class="time">{{ detailData.VoiceList.PlaySeconds | formatVoiceTime }}</view>
  38. </view>
  39. </view>
  40. <view class="is-paly-card">
  41. <image
  42. @click.stop="audioPlayBack"
  43. class=""
  44. :src="
  45. curVoiceId === detailData.ActivityId && !curAudioPaused
  46. ? 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/play_icon.gif'
  47. : 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/pause_icon.png'
  48. "
  49. ></image>
  50. </view>
  51. </view>
  52. <view class="fast-reverse">
  53. <image @click="speedReverseHandler('reverse')" class="speed-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/fastReverse_icon.png"></image>
  54. <block v-for="(item, index) in timesTheSpeed" :key="item.value">
  55. <view class="speed-button" v-if="isTimes == item.value" @click="isTimesHandler(index)">
  56. {{ item.name }}
  57. </view>
  58. </block>
  59. <image @click="speedReverseHandler('speed')" class="speed-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/speed_icon.png"></image>
  60. </view>
  61. <view class="card-title text_twoLine">
  62. {{ detailTitle(detailData.VoiceList.Name) }}
  63. <view class="title-image">
  64. <image @click="myLeavingMessageHandler" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/multimedia/leaving_message.png"></image>
  65. <image
  66. @click="isCollectionHandeler"
  67. :src="
  68. detailData.IsCollect
  69. ? 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/multimedia/collected_icon.png'
  70. : 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/multimedia/not_collected.png'
  71. "
  72. ></image>
  73. </view>
  74. </view>
  75. </view>
  76. </block>
  77. <block v-if="detailData.FileType == 2">
  78. <view class="video-play" v-if="detailData.VideoDetail && detailData.VideoDetail.ResourceUrl">
  79. <video
  80. :id="detailData.ActivityId"
  81. :src="detailData.VideoDetail.ResourceUrl"
  82. enable-play-gesture
  83. :custom-cache="false"
  84. object-fit="contain"
  85. show-mute-btn
  86. @ended="handleVideoEnd"
  87. @play="handelVideoPlay"
  88. @loadedmetadata="loadedmetadataHandle"
  89. @timeupdate="handleVideoTimeUpdate"
  90. ></video>
  91. <view class="title text_twoLine">
  92. {{ detailTitle(detailData.VideoDetail.Title) }}
  93. <view class="title-image">
  94. <image @click="myLeavingMessageHandler" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/multimedia/leaving_message.png"></image>
  95. <image
  96. @click="isCollectionHandeler"
  97. :src="
  98. detailData.IsCollect
  99. ? 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/multimedia/collected_icon.png'
  100. : 'https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/multimedia/not_collected.png'
  101. "
  102. ></image>
  103. </view>
  104. </view>
  105. </view>
  106. </block>
  107. <view class="city-box">
  108. <text class="network-left" v-if="detailData.ActivityTypeName">活动类型:</text>
  109. <view class="city">
  110. <text style="color: #333">
  111. <block v-if="detailData.ChartPermissionName !== '买方研选'">({{ detailData.ChartPermissionName }})</block>
  112. {{ detailData.ActivityTypeName }}
  113. </text>
  114. <view class="choose-limit" @click="strictSelection">
  115. <image v-if="detailData.ChartPermissionName.includes('研选')" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/purchaser.png" mode=""></image>
  116. <image v-if="detailData.IsShowSustainable" class="limit-img" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/limit_icon.png" mode=""></image>
  117. </view>
  118. <image v-if="detailData.City" style="margin-left: 15rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/location.png" mode=""></image>
  119. <text v-if="detailData.City">{{ detailData.City }}</text>
  120. </view>
  121. </view>
  122. <view v-if="detailData.Listndustrial.length" class="network dustrial-ui">
  123. <view class="network-left">产业标签:</view>
  124. <view class="network-right dustrial-content">
  125. <view class="item" v-for="item in detailData.Listndustrial" :key="item.IndustrialManagementId">
  126. <view :class="['dustrial-li', item.IsJump && 'dustrial-item']" @click="goDustrialHandler(item)">{{ item.IndustryName }} </view>
  127. <image v-if="item.IndustryNewLabel" class="new_icon" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png" mode=""></image>
  128. </view>
  129. </view>
  130. </view>
  131. <view v-if="detailData.ActivityTimeText" class="network">
  132. <view class="network-left">活动时间:</view>
  133. <view class="network-right">{{ detailData.ActivityTimeText }}</view>
  134. </view>
  135. <view v-if="detailData.DistinguishedGuest" class="network">
  136. <view class="network-left">嘉&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;宾:</view>
  137. <view class="network-right">{{ detailData.DistinguishedGuest }}</view>
  138. </view>
  139. <view v-if="detailData.Host" class="network">
  140. <view class="network-left">主&nbsp;&nbsp;持&nbsp;人:</view>
  141. <view class="network-right">{{ detailData.Host }}</view>
  142. </view>
  143. <view v-if="detailData.Speaker" class="network">
  144. <view class="network-left">主&nbsp;&nbsp;讲&nbsp;人:</view>
  145. <view class="network-right">{{ detailData.Speaker }}</view>
  146. </view>
  147. <view v-if="detailData.Expert" class="network">
  148. <view class="network-left">专家背景:</view>
  149. <view class="network-right">
  150. <rich-text :nodes="detailData.Expert"></rich-text>
  151. </view>
  152. </view>
  153. <view v-if="detailData.MainlandTell" class="network">
  154. <view class="network-left">大陆拨入:</view>
  155. <view class="network-right" style="color: #2c83ff" @click="phonebtn(detailData.MainlandTell)">{{ detailData.MainlandTell }}</view>
  156. </view>
  157. <view v-if="detailData.HongKongTell" class="network">
  158. <view class="network-left">香港拨入:</view>
  159. <view class="network-right" style="color: #2c83ff" @click="phonebtn(detailData.HongKongTell)">{{ detailData.HongKongTell }}</view>
  160. </view>
  161. <view v-if="detailData.TaiwanTell" class="network">
  162. <view class="network-left">台湾拨入:</view>
  163. <view class="network-right" style="color: #2c83ff" @click="phonebtn(detailData.TaiwanTell)">{{ detailData.TaiwanTell }}</view>
  164. </view>
  165. <view v-if="detailData.AmericaTell" class="network">
  166. <view class="network-left">美国拨入:</view>
  167. <view class="network-right" style="color: #2c83ff" @click="phonebtn(detailData.AmericaTell)">{{ detailData.AmericaTell }}</view>
  168. </view>
  169. <view v-if="detailData.ParticipationCode" class="network">
  170. <view class="network-left">拨入密码:</view>
  171. <view class="network-right">{{ [1, 2, 3].includes(detailData.ActivityTypeId) && detailData.IsLimitPeople && !detailData.IsSignup ? "请报名获取" : detailData.ParticipationCode }}</view>
  172. </view>
  173. <view class="network" v-if="detailData.OnlineParticipation">
  174. <view class="network-left">网络参会:</view>
  175. <view class="network-right network-link" v-if="[1, 2].includes(detailData.ActivityTypeId) && detailData.IsLimitPeople && !detailData.IsSignup"> 请报名获取 </view>
  176. <view class="network-right network-link" style="color: #2c83ff" v-else>
  177. <view class="">
  178. <text class="default text_oneLine" @click="networkBtn">{{ detailData.OnlineParticipation }}</text>
  179. <text class="default copy-link" @click="copyLink(1)">复制链接</text>
  180. </view>
  181. </view>
  182. </view>
  183. <view class="network" v-if="detailData.LinkParticipants">
  184. <view class="network-left">链接参会:</view>
  185. <view class="network-right network-zoom" style="color: #2c83ff">
  186. <view>
  187. <view class="default text_zoom" v-if="!detailData.IsSignup && detailData.ActivityTypeName == '公司调研电话会'">请报名获取 </view>
  188. <blcok v-else>
  189. <text class="default text_zoom">{{ detailData.LinkParticipants }}</text>
  190. <view> 点击<text class="default copy-link copy-zoom" @click="copyLink(1)">复制链接</text>在手机浏览器打开,并输入会议密码 </view>
  191. </blcok>
  192. </view>
  193. </view>
  194. </view>
  195. <view v-if="detailData.AppAttendance" class="network">
  196. <view class="network-left">App参会: </view>
  197. <view class="network-right">
  198. <rich-text :nodes="detailData.AppAttendance"></rich-text>
  199. </view>
  200. </view>
  201. <view v-if="detailData.ConferencePassword" class="network">
  202. <view class="network-left">拨入密码:</view>
  203. <view class="network-right">{{
  204. detailData.ActivityTypeName == "公司调研电话会" && detailData.IsLimitPeople && !detailData.IsSignup ? "请报名获取" : detailData.ConferencePassword
  205. }}</view>
  206. </view>
  207. <view v-if="detailData.Address" class="network">
  208. <view class="network-left">活动地址:</view>
  209. <view class="network-right" v-if="!detailData.IsSignup && detailData.ActivityTypeName == '公司线下调研' && detailData.IsLimitPeople">请报名获取 </view>
  210. <text class="network-right text-copy" user-select v-else>{{ detailData.Address }}</text>
  211. </view>
  212. <view v-if="detailData.Highlights" class="network">
  213. <view class="network-left">活动亮点: </view>
  214. <view class="network-right">
  215. <rich-text :nodes="detailData.Highlights"></rich-text>
  216. </view>
  217. </view>
  218. <view class="network" v-if="detailData.ArticleList.length">
  219. <view class="network-left">相关报告:</view>
  220. <view class="network-right look-link" style="color: #2c83ff" @click="articleLinkHandler"> 点击查看 </view>
  221. </view>
  222. <view class="network" v-if="detailData.TencentConferenceNumber">
  223. <view class="network-left">腾讯会议号:</view>
  224. <view class="network-right network-link" v-if="!detailData.IsSignup && (detailData.IsYidongConduct || detailData.IsLimitPeople)">请报名获取</view>
  225. <view class="network-right network-link" style="color: #2c83ff" v-else>
  226. <view class="">
  227. <text class="default tencent text_oneLine">{{ detailData.TencentConferenceNumber }}</text>
  228. <text class="default copy-link" @click="copyLink(2)">复制会议号</text>
  229. </view>
  230. </view>
  231. </view>
  232. <view v-if="detailData.Theme" class="network">
  233. <view class="network-left">主&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;题: </view>
  234. <view class="network-right">
  235. <rich-text :nodes="detailData.Theme"></rich-text>
  236. </view>
  237. </view>
  238. <view v-if="detailData.Remarks" class="network">
  239. <view class="network-left">备&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注: </view>
  240. <view class="network-right">
  241. <rich-text :nodes="detailData.Remarks"></rich-text>
  242. </view>
  243. </view>
  244. </view>
  245. <view class="" style="height: 50rpx"></view>
  246. <!-- 操作按钮部分 -->
  247. <view class="content-bottom">
  248. <block v-if="detailData.ActiveState == 1">
  249. <view class="make-outbound" @click="signupIsAddOfCancel(1)" v-if="detailData.IsShowOutboundCall">
  250. {{ detailData.LimitPeopleNum > 0 ? `${showOutboundCall}(${detailData.SignupNum}/${detailData.LimitPeopleNum})` : showOutboundCall }}
  251. </view>
  252. <view @click="meetingReminderCancel" class="make-conference" v-if="detailData.IsShowMeetingReminder">
  253. {{ detailData.IsCancelMeetingReminder == 1 ? "取消会议提醒" : "会议提醒" }}
  254. <text>(会前15分钟推送微信消息提醒)</text>
  255. </view>
  256. <view v-if="detailData.IsShowAppointment" @click="summaryIsHandel" class="make-generation make-conference">{{ detailData.IsAppointment == 1 ? "取消纪要" : "预约纪要" }}</view>
  257. <view v-if="detailData.IsShowHelpSsk" class="make-generation make-conference" @click="askingGo"> 帮我带问 </view>
  258. <view class="make-outbound" @click="wanttosignup" v-if="!detailData.IsSignup && detailData.IsShowSignup">
  259. {{ detailData.LimitPeopleNum > 0 ? `我要报名(${detailData.SignupNum}/${detailData.LimitPeopleNum})` : "我要报名" }}
  260. </view>
  261. <view v-if="detailData.IsSignup && detailData.IsShowSignup" class="make-outbound" @click="signupIsAddOfCancel(2)">
  262. {{ detailData.LimitPeopleNum > 0 ? `${showWay}(${detailData.SignupNum}/${detailData.LimitPeopleNum})` : showWay }}
  263. </view>
  264. </block>
  265. <view class="content-bottom" v-if="detailData.ActiveState == 2 && detailData.ActivityTypeId == 1">
  266. <view class="make-conference" @click="askingGo('提问')">
  267. 实时提问
  268. <text>会议过程中,分析师可替您提问专家</text>
  269. </view>
  270. </view>
  271. </view>
  272. </block>
  273. <!-- 参会方式的弹出层 -->
  274. <SelectPopup :selectShow.sync="selectShow" @signupIsAddOfCancel="signupIsAddOfCancel" :selectYdong="selectYdong" />
  275. <view class="select-box">
  276. <u-popup v-model="selectShowLink" mode="bottom">
  277. <view style="color: #2c83ff" class="text_oneLine article-title" @click="goDetail(item.ArticleId)" v-for="item in detailData.ArticleList" :key="item.ArticleId"> {{ item.Title }}</view>
  278. <view style="color: #a9afb8" @click="selectShowLink = false">取消</view>
  279. </u-popup>
  280. </view>
  281. <!-- 各种弹框部分 -->
  282. <modalDialog
  283. :isShow="isShow"
  284. :signupType="signupType"
  285. :goFollow="goFollow"
  286. :isCancelShow="isCancelShow"
  287. :idTypeCancel="idTypeCancel"
  288. :editIsShow="editIsShow"
  289. :countryCode="countryCode"
  290. :mobileEdit="mobileEdit"
  291. :goOnNextStep="goOnNextStep"
  292. :jurisdictionList="jurisdictionList"
  293. :mailboxBinding="mailboxBinding"
  294. />
  295. </view>
  296. <!-- 权限部分 -->
  297. <view v-else>
  298. <jurisdiction :idAct="id" :jurisdictionList="jurisdictionList"></jurisdiction>
  299. </view>
  300. <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
  301. <view v-show="false">
  302. <audioModule ref="childrenAudio" :showAudioPop="showAudioPop" />
  303. </view>
  304. <suspenButton v-if="showSingInImg" :showSingInImg.sync="showSingInImg" type="活动详情">
  305. <template slot="center">
  306. <image mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/sing_in_icon.png"> </image>
  307. </template>
  308. <template slot="top">
  309. <image @click.stop="isDlgImg = true" mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/sign_in_img.png"> </image>
  310. </template>
  311. <template slot="left">
  312. <image @click.stop="goSingUpDetail" mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/sing_up_details.png"> </image>
  313. </template>
  314. </suspenButton>
  315. <van-popup custom-class="custom-class-popup" :show="isDlgImg" @close="onCloseHandler">
  316. <view class="sign-in-img-box">
  317. <image :src="detailData.SigninImg"></image>
  318. <view class="button-box">
  319. <text @click="onCloseHandler">关闭</text>
  320. <text @click="downloadImage">保存图片</text>
  321. </view>
  322. </view>
  323. </van-popup>
  324. <!-- 各种弹框部分 -->
  325. <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList"/>
  326. </view>
  327. <not-have-login v-else />
  328. </block>
  329. </template>
  330. <script>
  331. import { activity, User, Home } from "@/config/api.js";
  332. import modalDialog from "@/components/modalDialog.vue";
  333. import jurisdiction from "./jurisdiction/components.vue";
  334. import freeCharge from "@/components/freeCharge";
  335. import audioModule from "@/components/audioModule/index";
  336. import manageMixin from "./manageMixin";
  337. import IsTrackFollow from "@/components/isTrackFollow.vue";
  338. import SelectPopup from "@/components/activity/selectPopup";
  339. import NotHaveLogin from "@/components/notHaveLogin.vue";
  340. import suspenButton from "@/components/suspen_button.vue";
  341. import ShowResearchDlg from '@/components/activity/showResearchDlg.vue';
  342. let app = getApp({ allowDefault: true });
  343. export default {
  344. filters: {
  345. formatVoiceTime(e) {
  346. let m = parseInt(e / 60);
  347. let s = parseInt(e % 60);
  348. return `${m > 9 ? m : "0" + m}:${s > 9 ? s : "0" + s}`;
  349. },
  350. },
  351. data() {
  352. return {
  353. id: "",
  354. detailData: {},
  355. isShowJurisdiction: false,
  356. isGain: true,
  357. signupType: "", //关注类型
  358. goFollow: false, //是否关注公众号
  359. isShow: false, //弹框
  360. isCancelShow: false,
  361. idTypeCancel: {
  362. id: "",
  363. type: 1,
  364. cutId: "",
  365. state: "",
  366. },
  367. selectShow: false, // 参会方式的隐藏显示
  368. selectYdong: false, // 参会方式展示的文案
  369. haveAuth: "",
  370. jurisdictionList: {},
  371. editIsShow: false, //外呼莫泰框
  372. countryCode: "", //外呼区号
  373. mobileEdit: "", //外呼手机号
  374. goOnNextStep: "", //设置外呼号后弹出哪个
  375. mailboxBinding: false, //是否绑定邮箱
  376. play: false,
  377. timesTheSpeed: [
  378. { name: "倍速", value: 1 },
  379. { name: "1.25倍", value: 1.25 },
  380. { name: "1.5倍", value: 1.5 },
  381. { name: "2倍", value: 2 },
  382. ],
  383. curTime: 0,
  384. videoContext: null,
  385. isVideoPlay: false,
  386. selectShowLink: false,
  387. isSendWx: "",
  388. isDlgImg: false,
  389. showSingInImg: false,
  390. isResearchModalShow: false,
  391. checkResearchList:{}
  392. };
  393. },
  394. mixins: [manageMixin],
  395. computed: {
  396. curVoiceId() {
  397. //当前正在播放的音频id
  398. return this.$store.state.audioBg.activityId;
  399. },
  400. curAudioPaused() {
  401. //当前音频是否暂停状态
  402. return this.$store.state.audioBg.paused;
  403. },
  404. //视频的id
  405. activityVideoId() {
  406. return this.$store.state.videoPlay.playVideoActId;
  407. },
  408. //报名的显示
  409. showWay() {
  410. let text = this.detailData.SignupType == 1 ? "取消外呼" : "取消报名";
  411. return text;
  412. },
  413. showOutboundCall() {
  414. let text = this.detailData.IsSignup ? "取消外呼" : "预约外呼";
  415. return text;
  416. },
  417. //几倍的播放数度
  418. isTimes() {
  419. let isMultiple = this.curVoiceId === this.detailData.ActivityId ? this.$store.state.audioBg.multiple : 1;
  420. return isMultiple;
  421. },
  422. showAudioPop() {
  423. return this.$store.state.audioBg.show;
  424. },
  425. },
  426. components: {
  427. modalDialog,
  428. jurisdiction,
  429. freeCharge,
  430. audioModule,
  431. IsTrackFollow,
  432. SelectPopup,
  433. NotHaveLogin,
  434. suspenButton,
  435. ShowResearchDlg,
  436. },
  437. watch: {
  438. haveAuth: {
  439. handler() {
  440. if (this.haveAuth == 1) {
  441. this.$store.dispatch("statistics", { PageType: "ActivitParticulars", DetailId: this.id });
  442. }
  443. },
  444. immediate: true,
  445. },
  446. "$store.state.audioBg.curTime": {
  447. handler(newVal) {
  448. this.curTime = this.curVoiceId === this.detailData.ActivityId ? newVal : 0;
  449. },
  450. immediate: true,
  451. deep: true,
  452. },
  453. },
  454. methods: {
  455. downloadImage() {
  456. wx.downloadFile({
  457. url: this.detailData.SigninImg,
  458. success(res) {
  459. wx.saveImageToPhotosAlbum({
  460. filePath: res.tempFilePath,
  461. success(data) {
  462. wx.showModal({
  463. title: "提示",
  464. content: "保存成功",
  465. modalType: false,
  466. });
  467. },
  468. fail(err) {
  469. if (
  470. err.errMsg === "saveImageToPhotosAlbum:fail:auth denied" ||
  471. err.errMsg === "saveImageToPhotosAlbum:fail auth deny" ||
  472. err.errMsg === "saveImageToPhotosAlbum:fail authorize no response"
  473. ) {
  474. wx.showModal({
  475. title: "提示",
  476. content: "需要您授权保存相册",
  477. modalType: false,
  478. success: (modalSuccess) => {
  479. wx.openSetting({
  480. success(settingdata) {
  481. console.log("settingdata", settingdata);
  482. if (settingdata.authSetting["scope.writePhotosAlbum"]) {
  483. wx.showModal({
  484. title: "提示",
  485. content: "获取权限成功,再次点击图片即可保存",
  486. modalType: false,
  487. });
  488. } else {
  489. wx.showModal({
  490. title: "提示",
  491. content: "获取权限失败,将无法保存到相册哦~",
  492. modalType: false,
  493. });
  494. }
  495. },
  496. fail(failData) {
  497. console.log("failData", failData);
  498. },
  499. complete(finishData) {
  500. console.log("finishData", finishData);
  501. },
  502. });
  503. },
  504. });
  505. }
  506. },
  507. });
  508. },
  509. });
  510. },
  511. onCloseHandler() {
  512. this.isDlgImg = false;
  513. },
  514. // 获取详情
  515. getActivityDetail() {
  516. activity
  517. .getActivityDetail({
  518. ActivityId: this.id,
  519. PageRouter: this.$store.state.pageRouterActivity,
  520. IsSendWx: this.isSendWx,
  521. })
  522. .then((res) => {
  523. if (res.Ret == 200) {
  524. this.$store.commit("setRouterActivity", "活动详情");
  525. this.haveAuth = res.Data.HasPermission;
  526. this.jurisdictionList = res.Data;
  527. if (res.Data.HasPermission == 1) {
  528. this.detailData = res.Data.Detail;
  529. this.showSingInImg = this.detailData.IsShowSigninButton;
  530. this.synchronization();
  531. }
  532. }
  533. });
  534. },
  535. // 同步数据
  536. synchronization() {
  537. let pages = getCurrentPages();
  538. let prevPage = pages[pages.length - 2];
  539. let path = prevPage ? prevPage.$page.fullPath : "";
  540. if (path.includes("/activityPages/themeActivity/themeActivity") || path.includes("/pages-search/indedxSearch/indedxSearch?source=活动详情页面")) {
  541. const index = prevPage.$vm.collectList.findIndex((item) => item.ActivityId == this.id);
  542. prevPage.$vm.collectList[index].IsSignup = this.detailData.IsSignup;
  543. prevPage.$vm.collectList[index].SignupNum = this.detailData.SignupNum;
  544. prevPage.$vm.collectList[index].SignupType = this.detailData.SignupType;
  545. prevPage.$vm.collectList[index].IsAppointment = this.detailData.IsAppointment;
  546. prevPage.$vm.collectList[index].IsCancelMeetingReminder = this.detailData.IsCancelMeetingReminder;
  547. }
  548. },
  549. // 拨打电话
  550. phonebtn(phone) {
  551. uni.makePhoneCall({
  552. phoneNumber: phone,
  553. });
  554. },
  555. // 跳转新的小程序
  556. networkBtn() {
  557. if (this.detailData.OnlineParticipation.includes("http")) {
  558. uni.navigateTo({
  559. url: "/activityPages/networkAttend/networkAttend?url=" + this.detailData.OnlineParticipation,
  560. });
  561. } else {
  562. uni.navigateToMiniProgram({
  563. appId: "wxade30ff0c4ee757d",
  564. path: this.detailData.OnlineParticipation,
  565. });
  566. }
  567. },
  568. // 弹框的回调事件
  569. cancelEnsure() {
  570. this.getActivityDetail();
  571. },
  572. // 跳转
  573. goDetail(id) {
  574. uni.navigateTo({
  575. url: "/pageMy/reportDetail/reportDetail?id=" + id,
  576. });
  577. },
  578. // 提问
  579. async askingGo(type = "") {
  580. await activity.checkAskActivity({ ActivityId: Number(this.id), PageRouter: this.$store.state.pageRouterActivity });
  581. uni.navigateTo({
  582. url: "/activityPages/generationAsk/generationAsk?id=" + this.id + "&type=" + type,
  583. });
  584. },
  585. //点击了严选
  586. strictSelection() {
  587. activity.descriptionOfResearch().then((res) => {
  588. if (res.Ret == 200) {
  589. uni.showModal({
  590. content: res.Data.Item.ConfigValue,
  591. confirmText: "知道了",
  592. showCancel: false,
  593. confirmColor: "#3385FF",
  594. success: function (res) {},
  595. });
  596. }
  597. });
  598. },
  599. // 复制的操作
  600. copyLink(type) {
  601. uni.setClipboardData({
  602. data: type == 1 ? this.detailData.LinkParticipants || this.detailData.OnlineParticipation : this.detailData.TencentConferenceNumber,
  603. success: function () {
  604. uni.showToast({
  605. title: `复制成功${type == 1 ? ",可在浏览器打开" : ""}`,
  606. icon: "none",
  607. duration: 2000,
  608. });
  609. },
  610. });
  611. },
  612. // 跳转产业标签
  613. goDustrialHandler(item) {
  614. if (!item.IsJump) return;
  615. if (item.IsResearch) {
  616. //严选
  617. uni.navigateTo({ url: "/reportPages/researchTheme/researchTheme?id=" + item.IndustrialManagementId });
  618. } else {
  619. //非严选
  620. uni.navigateTo({ url: "/reportPages/IndustryReport/IndustryReport?id=" + item.IndustrialManagementId });
  621. }
  622. },
  623. // 音频点击暂停播放
  624. audioPlayBack() {
  625. if (this.$store.state.audioBg.activityId == this.detailData.ActivityId) {
  626. if (this.globalBgAudioManager.paused) {
  627. this.globalBgAudioManager.play();
  628. } else {
  629. this.globalBgAudioManager.pause();
  630. }
  631. } else {
  632. this.$store.commit("audioBg/addAudio", {
  633. list: this.detailData.VoiceList,
  634. activityId: this.detailData.ActivityId,
  635. activityTitle: this.detailData.ActivityName,
  636. });
  637. }
  638. },
  639. // 拖动进度条
  640. handleAudioSliderChangeing(e) {
  641. this.curTime = e.detail.value;
  642. },
  643. // 拖动进度条
  644. handleAudioSliderChange(e) {
  645. const value = e.detail.value;
  646. this.globalBgAudioManager.seek(value);
  647. this.$refs.childrenAudio.isRecord = false;
  648. setTimeout(() => {
  649. this.$store.commit("audioBg/setSlide", false);
  650. }, 300);
  651. },
  652. // 手指离开拖动进度条
  653. touchstartHandler() {
  654. this.$store.commit("audioBg/setSlide", true);
  655. },
  656. //倍速播放
  657. isTimesHandler(i) {
  658. if (this.$store.state.audioBg.activityId == this.detailData.ActivityId) {
  659. let index = i == 3 ? 0 : i + 1;
  660. this.$store.commit("audioBg/setMultiple", this.timesTheSpeed[index].value);
  661. this.globalBgAudioManager.playbackRate = this.isTimes;
  662. this.globalBgAudioManager.startTime = this.curTime;
  663. if (this.globalBgAudioManager.paused) {
  664. this.globalBgAudioManager.play();
  665. }
  666. } else {
  667. this.$store.commit("audioBg/removeAudio");
  668. this.$store.commit("audioBg/addAudio", {
  669. list: this.detailData.VoiceList,
  670. activityId: this.detailData.ActivityId,
  671. activityTitle: this.detailData.ActivityName,
  672. });
  673. }
  674. this.$refs.childrenAudio.isRecord = false;
  675. },
  676. //快进 快退
  677. speedReverseHandler(type) {
  678. let isTime = type == "reverse" ? this.curTime - 15 : this.curTime + 15;
  679. isTime = isTime <= 0 ? 0 : isTime >= this.detailData.VoiceList.PlaySeconds ? this.detailData.VoiceList.PlaySeconds - 1 : isTime;
  680. this.globalBgAudioManager.seek(isTime);
  681. this.$refs.childrenAudio.isRecord = false;
  682. },
  683. //视频元数据加载完成时触发
  684. loadedmetadataHandle() {
  685. this.videoContext = wx.createVideoContext(this.detailData.ActivityId.toString(), this);
  686. let curVideoTime = 0;
  687. if (this.activityVideoId == this.detailData.ActivityId) {
  688. curVideoTime = this.$store.state.videoPlay.palyCurrentTime;
  689. } else {
  690. this.$store.commit("videoPlay/playVideoActivity", this.detailData.ActivityId);
  691. }
  692. this.videoContext.seek(curVideoTime);
  693. },
  694. //视频播放结束
  695. handleVideoEnd() {
  696. // 此处因为如果不调用退出全屏方法 安卓和ios页面均会表现异常,安卓横屏不恢复竖屏,ios底部tabbar渲染异常
  697. this.videoContext.exitFullScreen();
  698. },
  699. //视频时间的更新
  700. handleVideoTimeUpdate(e) {
  701. let time = parseInt(e.detail.currentTime);
  702. this.$store.commit("videoPlay/palyTimeUpdate", time);
  703. },
  704. //视频的播放事件
  705. handelVideoPlay() {
  706. if (!this.isVideoPlay) {
  707. Home.microAideoHistoryAdd({ VideoId: this.detailData.ActivityId, SourceType: 2 });
  708. }
  709. this.isVideoPlay = true;
  710. },
  711. // 标题超出省略...
  712. detailTitle(val) {
  713. let str = val.length > 41 ? val.slice(0, 41) + "..." : val;
  714. return str;
  715. },
  716. // 微路演留言
  717. myLeavingMessageHandler() {
  718. let title = this.detailData.FileType == 1 ? this.detailData.VoiceList.Name : this.detailData.VideoDetail.Title;
  719. uni.navigateTo({
  720. url: "/activityPages/generationAsk/generationAsk?id=" + this.detailData.ActivityId + "&type=文章&roadshow=" + this.detailData.FileType + "&roadshowTitle=" + title,
  721. });
  722. },
  723. // 微路演收藏
  724. async isCollectionHandeler() {
  725. await this.$store.dispatch("showLoginModal");
  726. const res = await Home.microRoadshowCollect({
  727. Id: this.detailData.FileType == 1 ? this.detailData.VoiceList.ActivityVoiceId : this.detailData.VideoDetail.Id,
  728. SourceType: this.detailData.FileType,
  729. PageRouter: this.$store.state.pageRouterReport,
  730. });
  731. if (res.Ret === 200) {
  732. uni.showToast({
  733. title: res.Msg,
  734. duration: 2000,
  735. });
  736. this.detailData.IsCollect = !this.detailData.IsCollect;
  737. }
  738. },
  739. articleLinkHandler() {
  740. if (this.detailData.ArticleList.length === 1) {
  741. uni.navigateTo({
  742. url: "/pageMy/reportDetail/reportDetail?id=" + this.detailData.ArticleList[0].ArticleId,
  743. });
  744. } else {
  745. this.selectShowLink = true;
  746. }
  747. },
  748. // 去往报名详情
  749. goSingUpDetail() {
  750. uni.navigateTo({
  751. url: "/pages-message/activityTemplate/activityTemplate?id=" + this.id,
  752. });
  753. },
  754. },
  755. onLoad(option) {
  756. this.id = option.id || "";
  757. this.isSendWx = option.IsSendWx || "";
  758. // 详情页面不写路径
  759. },
  760. onShow() {
  761. if (!this.$store.state.isAuth && !this.$store.state.isBind) {
  762. //已授权已绑定
  763. this.getActivityDetail();
  764. }
  765. this.$store.commit("setRouterReport", "活动详情");
  766. },
  767. /**
  768. * 用户点击分享
  769. */
  770. onShareAppMessage: function (res) {
  771. return {
  772. title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : "活动详情",
  773. path: "/activityPages/activityDetail/activityDetail?id=" + this.id,
  774. success: (res) => {},
  775. fail: (err) => {},
  776. };
  777. },
  778. };
  779. </script>
  780. <style lang="scss">
  781. .activity-detail {
  782. padding-bottom: 100rpx;
  783. .text-copy {
  784. padding-top: 2rpx;
  785. line-height: normal !important;
  786. padding-left: 20rpx;
  787. }
  788. .notice {
  789. height: 60rpx;
  790. width: 100%;
  791. }
  792. .content {
  793. padding: 34rpx 34rpx 0rpx;
  794. margin-bottom: -20rpx;
  795. color: #333333;
  796. font-size: 28rpx;
  797. view {
  798. padding-left: 20rpx;
  799. }
  800. text {
  801. line-height: 80rpx;
  802. padding-left: 20rpx;
  803. }
  804. .phone {
  805. padding: 0;
  806. display: inline-block;
  807. color: #2c83ff;
  808. }
  809. .new_icon {
  810. width: 60rpx;
  811. height: 30rpx;
  812. margin: 0 20rpx 20rpx 0;
  813. }
  814. .dialog-title {
  815. width: 682rpx;
  816. padding: 20rpx;
  817. background: #f2f2f2;
  818. opacity: 0.8;
  819. font-size: 30rpx;
  820. font-weight: bold;
  821. margin-bottom: 15rpx;
  822. color: #000;
  823. image {
  824. width: 83rpx;
  825. height: 33rpx;
  826. vertical-align: middle;
  827. margin-right: 5rpx;
  828. }
  829. }
  830. .brackets-title {
  831. padding-left: 20rpx;
  832. }
  833. .city-box {
  834. display: flex;
  835. align-items: center;
  836. .network-left {
  837. width: 170rpx;
  838. text-align-last: justify;
  839. text-align: justify;
  840. }
  841. text {
  842. padding: 0;
  843. }
  844. .city {
  845. display: flex;
  846. color: #2088ff;
  847. align-items: center;
  848. image {
  849. width: 27rpx;
  850. height: 32rpx;
  851. margin-right: 12rpx;
  852. }
  853. .choose-limit {
  854. position: relative;
  855. display: flex;
  856. align-items: center;
  857. margin-right: 20rpx;
  858. image {
  859. width: 130rpx;
  860. height: 38rpx;
  861. }
  862. .limit-img {
  863. position: absolute;
  864. top: -13rpx;
  865. right: -30rpx;
  866. width: 46rpx;
  867. height: 26rpx;
  868. }
  869. }
  870. }
  871. }
  872. }
  873. .network {
  874. margin-bottom: 30rpx;
  875. padding: 0 !important;
  876. display: flex;
  877. .network-left {
  878. width: 190rpx;
  879. text-align-last: justify;
  880. text-align: justify;
  881. flex-shrink: 0;
  882. }
  883. .network-right {
  884. width: 480rpx;
  885. }
  886. .dustrial-content {
  887. display: flex;
  888. flex-wrap: wrap;
  889. .item {
  890. display: flex;
  891. align-items: center;
  892. padding-left: 0;
  893. margin-left: 0;
  894. }
  895. }
  896. .network-zoom {
  897. .text_zoom {
  898. width: 100%;
  899. word-break: break-all;
  900. color: #333333;
  901. }
  902. view {
  903. padding: 0 !important;
  904. margin: 0 !important;
  905. }
  906. .copy-zoom {
  907. display: inline-block;
  908. padding: 5rpx 17rpx !important;
  909. border-radius: 34rpx;
  910. background-color: #ebf4ff;
  911. font-size: 24rpx;
  912. color: #2c83ff;
  913. margin: 0 10rpx;
  914. margin-top: 30rpx;
  915. }
  916. }
  917. .network-link {
  918. width: 520rpx !important;
  919. view {
  920. padding: 0 !important;
  921. margin: 0 !important;
  922. width: 100%;
  923. display: flex;
  924. justify-content: space-between;
  925. :first-child {
  926. width: 350rpx;
  927. }
  928. .tencent {
  929. width: 320rpx;
  930. }
  931. .copy-link {
  932. flex-shrink: 0;
  933. padding: 5rpx 17rpx !important;
  934. border-radius: 34rpx;
  935. background-color: #ebf4ff;
  936. font-size: 24rpx;
  937. color: #2c83ff;
  938. }
  939. }
  940. }
  941. }
  942. .default {
  943. // padding: 0 !important;
  944. // margin: 0;
  945. padding-left: 0 !important;
  946. line-height: 40rpx !important;
  947. }
  948. .content-bottom {
  949. margin: 50rpx 0 30rpx;
  950. .make-outbound {
  951. margin: 0 auto;
  952. width: 368rpx;
  953. height: 80rpx;
  954. background: linear-gradient(268deg, #2ddbff 0%, #1599ff 49%, #005eff 100%);
  955. opacity: 1;
  956. border-radius: 4rpx;
  957. color: #ffffff;
  958. font-size: 34rpx;
  959. line-height: 80rpx;
  960. text-align: center;
  961. }
  962. .make-generation {
  963. padding-top: 0rpx !important;
  964. line-height: 76rpx;
  965. }
  966. .make-conference {
  967. margin: 30rpx auto;
  968. width: 368rpx;
  969. height: 80rpx;
  970. border: 2px solid #2c83ff;
  971. opacity: 1;
  972. border-radius: 4rpx;
  973. padding-top: 5rpx;
  974. text-align: center;
  975. color: #2c83ff;
  976. font-size: 30rpx;
  977. text {
  978. font-size: 16rpx;
  979. }
  980. }
  981. }
  982. .bottom-env {
  983. position: fixed;
  984. bottom: 0;
  985. padding-bottom: constant(safe-area-inset-bottom);
  986. padding-bottom: env(safe-area-inset-bottom);
  987. left: 0;
  988. width: 100%;
  989. background-color: #ffffff;
  990. }
  991. .apply-box {
  992. width: 100%;
  993. height: 100rpx;
  994. display: flex;
  995. font-size: 32rpx;
  996. color: #333333;
  997. line-height: 100rpx;
  998. .cancel-apply {
  999. display: flex;
  1000. padding-left: 50rpx;
  1001. flex: 1;
  1002. border: 2rpx solid #005eff;
  1003. background-color: #fff;
  1004. text {
  1005. color: #005eff;
  1006. }
  1007. }
  1008. .ok-apply {
  1009. flex: 1;
  1010. background: linear-gradient(268deg, #2ddbff 0%, #1599ff 49%, #005eff 100%);
  1011. text-align: center;
  1012. color: #ffffff;
  1013. }
  1014. }
  1015. .select-box {
  1016. width: 100%;
  1017. view {
  1018. height: 95prx;
  1019. line-height: 95rpx;
  1020. text-align: center;
  1021. font-size: 32rpx;
  1022. border-bottom: 1rpx solid #ebebeb;
  1023. }
  1024. }
  1025. .dustrial-ui {
  1026. margin-bottom: 10rpx !important;
  1027. }
  1028. .dustrial-li {
  1029. display: flex;
  1030. align-items: center;
  1031. padding: 0 13rpx;
  1032. margin: 0 20rpx 20rpx 0;
  1033. }
  1034. .dustrial-item {
  1035. background: #edf4ff;
  1036. border: 1px solid #3385ff;
  1037. border-radius: 4rpx;
  1038. color: #3385ff;
  1039. }
  1040. .audio-card {
  1041. width: 100%;
  1042. height: 334rpx;
  1043. background: #fff;
  1044. box-shadow: 0px 3rpx 8rpx 0rpx rgba(0, 0, 0, 0.05);
  1045. border-radius: 8rpx;
  1046. margin: 0 auto;
  1047. padding: 30rpx;
  1048. padding-left: 30rpx;
  1049. view {
  1050. padding-left: 0;
  1051. }
  1052. .slider {
  1053. width: 100%;
  1054. margin: 0;
  1055. }
  1056. .slider-paly {
  1057. display: flex;
  1058. height: 80rpx;
  1059. align-items: center;
  1060. padding-left: 20rpx;
  1061. }
  1062. .card-title {
  1063. margin-top: 20rpx;
  1064. font-size: 28rpx;
  1065. padding: 15rpx 0 0 15rpx;
  1066. line-height: 44rpx;
  1067. height: 100rpx;
  1068. position: relative;
  1069. }
  1070. .card-time {
  1071. display: flex;
  1072. justify-content: space-between;
  1073. color: #999999;
  1074. font-size: 20rpx;
  1075. }
  1076. .title-image {
  1077. position: absolute;
  1078. bottom: 0;
  1079. right: 0;
  1080. width: 150rpx;
  1081. height: 40rpx;
  1082. padding-left: 15rpx;
  1083. display: flex;
  1084. justify-content: space-between;
  1085. image {
  1086. width: 40rpx;
  1087. height: 40rpx;
  1088. }
  1089. }
  1090. .is-paly-card {
  1091. width: 70rpx;
  1092. height: 70rpx;
  1093. flex-shrink: 0;
  1094. margin-left: 30rpx;
  1095. image {
  1096. width: 70rpx;
  1097. height: 70rpx;
  1098. }
  1099. }
  1100. .fast-reverse {
  1101. display: flex;
  1102. align-items: center;
  1103. justify-content: center;
  1104. margin-top: 30rpx;
  1105. .speed-button {
  1106. width: 96rpx;
  1107. height: 47rpx;
  1108. background: #eaeaea;
  1109. border-radius: 8rpx;
  1110. text-align: center;
  1111. line-height: 47rpx;
  1112. margin: 0 70rpx;
  1113. padding-left: 0;
  1114. }
  1115. .speed-img {
  1116. width: 50rpx;
  1117. height: 50rpx;
  1118. }
  1119. }
  1120. }
  1121. .video-play {
  1122. width: 100%;
  1123. padding-left: 0rpx !important;
  1124. padding-bottom: 15rpx;
  1125. height: 470rpx;
  1126. border-radius: 8rpx;
  1127. overflow: hidden;
  1128. box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.05);
  1129. font-size: 28rpx;
  1130. color: #333333;
  1131. margin-top: 20rpx;
  1132. video {
  1133. height: 340rpx;
  1134. width: 100%;
  1135. }
  1136. .title {
  1137. padding: 15rpx 0 0 15rpx !important;
  1138. font-size: 28rpx;
  1139. line-height: 44rpx;
  1140. height: 100rpx;
  1141. position: relative;
  1142. .title-flat {
  1143. float: right;
  1144. width: 150rpx;
  1145. height: 40rpx;
  1146. margin-top: -36rpx;
  1147. background-color: #f00;
  1148. }
  1149. .title-image {
  1150. position: absolute;
  1151. bottom: 0;
  1152. right: 0;
  1153. width: 150rpx;
  1154. height: 40rpx;
  1155. padding-left: 15rpx;
  1156. display: flex;
  1157. justify-content: space-between;
  1158. image {
  1159. width: 40rpx;
  1160. height: 40rpx;
  1161. }
  1162. }
  1163. }
  1164. }
  1165. .select-box {
  1166. width: 100%;
  1167. .box {
  1168. height: 95prx;
  1169. line-height: 95rpx;
  1170. text-align: center;
  1171. font-size: 32rpx;
  1172. border-bottom: 1rpx solid #ebebeb;
  1173. }
  1174. .box-bottom {
  1175. border-bottom: none !important;
  1176. }
  1177. }
  1178. .article-title {
  1179. padding: 0 20rpx;
  1180. }
  1181. .look-link {
  1182. background: #3385ff;
  1183. border-radius: 4rpx;
  1184. color: #fff !important;
  1185. width: 160rpx !important;
  1186. height: 40rpx;
  1187. text-align: center;
  1188. line-height: 40rpx;
  1189. margin-left: 20rpx;
  1190. padding-left: 0 !important;
  1191. }
  1192. .sign-in-img-box {
  1193. width: 704rpx;
  1194. height: 1121rpx;
  1195. background-color: #fff;
  1196. border-radius: 8rpx;
  1197. overflow: hidden;
  1198. image {
  1199. width: 100%;
  1200. height: calc(100% - 108rpx);
  1201. }
  1202. .button-box {
  1203. display: flex;
  1204. align-items: center;
  1205. height: 102rpx;
  1206. border-top: 1rpx solid #f0f0f0;
  1207. text {
  1208. flex: 1;
  1209. height: 100%;
  1210. display: flex;
  1211. align-items: center;
  1212. justify-content: center;
  1213. }
  1214. text:last-child {
  1215. border-left: 1rpx solid #f0f0f0;
  1216. color: #3385ff;
  1217. }
  1218. }
  1219. }
  1220. .custom-class-popup {
  1221. border-radius: 8rpx;
  1222. overflow: hidden;
  1223. }
  1224. }
  1225. </style>