checkInRoute.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. <template>
  2. <page-layout>
  3. <nav-bar title="逛展打卡路线" @init="onInitNavbar"></nav-bar>
  4. <scroll-view id="scrollContainer" scroll-with-animation="true" :scroll-top="scroll_top" :scroll-y="true"
  5. style="height: 100vh" :scroll-into-view="scrollIntoViewId">
  6. <view class="outter">
  7. <view class="body">
  8. <view class="theme-title">
  9. <text class="title">逛展打卡路线</text>
  10. <image mode="aspectFit" class="title-bg"
  11. src="https://www.productronicachina.com.cn/resources/files/0221/67b7dd27b30b7/标题星星.png"></image>
  12. </view>
  13. <view class="pagination">
  14. <view class="page-change">
  15. <view @click="current_page=true" :class="['page-item',current_page?'active':'']">活动介绍</view>
  16. <view @click="current_page=false" :class="['page-item',current_page?'':'active']">活动规则</view>
  17. </view>
  18. <view class="page">
  19. <view v-show="current_page" class="page-item">
  20. <mp-html :content="routeInfoData.description"></mp-html>
  21. </view>
  22. <view v-show="!current_page" class="page-item">
  23. <!-- <mp-html :content="routeInfoData.rules"></mp-html>-->
  24. <view style="margin-bottom: 24rpx;">2025慕尼黑上海电子展展会现场将设有9条热门路线。观众可参与打卡调整。
  25. <text style="font-weight: bold;color: #E57519;">
  26. 打卡满任意2条,5条,8条分别获对应礼品。满9条路线完成终极挑战,除获得对应礼品以外,更有机会参与抽奖,赢取幸运大奖。
  27. </text>
  28. </view>
  29. <view style="margin-bottom: 16rpx;">
  30. <text style="font-weight: bold;">活动时间:</text>
  31. 2025326-328
  32. </view>
  33. <view style="margin-bottom: 16rpx;">
  34. <text style="font-weight: bold;">参与人员:</text>
  35. 2025慕尼黑上海电子生产设备展现场观众
  36. </view>
  37. <view style="margin-bottom: 24rpx;">
  38. <text style="font-weight: bold;">奖品兑换区:</text>
  39. 展会现场礼品发放处【W3.3689
  40. </view>
  41. <view style="margin-bottom: 16rpx;">① 展会期间,每人可领取完成最高线路的对应奖品,每人仅有一次兑奖机会。
  42. </view>
  43. <view style="margin-bottom: 16rpx;">② 礼品数量有限,仅限展会期间领取,先到先得,一旦赠完即止。</view>
  44. <view style="margin-bottom: 16rpx;">③
  45. 【我的奖品】页面可了解获奖详情。点击【可领取奖品】至展会现场礼品发放处【W3.3689】进行奖品核销与兑换。
  46. </view>
  47. <view>④ 满9条路线的观众可将名片放置抽奖箱,获奖结果将于展后公布。</view>
  48. </view>
  49. <view class="light" :style="{transform:current_page?'translateX(-100%)':'translateX(100%)'}"></view>
  50. </view>
  51. </view>
  52. <van-collapse custom-class="check_list" :border="false" v-model="activeNames" @change="onChange">
  53. <van-collapse-item :custom-class="activeNames.includes(r_index) ? 'expand_item' : ''" :border="false"
  54. class="router-item" v-for="(route,r_index) in routeInfoData.routes" :key="r_index"
  55. :name="r_index">
  56. <view slot="title" class="item-head" :id="'module' + r_index">
  57. <view class="route-name">{{ route.name }}</view>
  58. <view class="product-type">
  59. <view class="text">{{ route.description }}</view>
  60. <view class="button" v-show="route.map_btn_name" @click.stop="showOverlayEvent(route.map_url)">
  61. {{ route.map_btn_name }}
  62. <text class="iconfont icon-Search"></text>
  63. </view>
  64. </view>
  65. <view class="progress">
  66. <view class="text" v-if="getProcess(route.exhibitors,true)">
  67. 打卡已完成{{ getProcess(route.exhibitors, false) }}
  68. </view>
  69. <view class="text disable_text" v-else>未开始{{ getProcess(route.exhibitors, false) }}</view>
  70. <view class="inner">
  71. <view :style="{width:getProcess(route.exhibitors,true)*100+'%'}" class="inner-process">
  72. <view class="text" :style="{width:'calc(100% / '+getProcess(route.exhibitors,true)+')'}">
  73. 打卡已完成{{ getProcess(route.exhibitors, false) }}
  74. </view>
  75. </view>
  76. </view>
  77. </view>
  78. </view>
  79. <view class="iconfont icon-Down" @click="onChangeVanItem(r_index)"></view>
  80. <view class="item-body">
  81. <view v-for="(exhibit,e_index) in route.exhibitors"
  82. :id="'module' + r_index + '_' + e_index"
  83. :class="['exhibit-item',exhibit.checkin_status === 1 ?'checked':'']">
  84. <image mode="aspectFit" class="logo" :src="exhibit.logo"></image>
  85. <view class="name">{{ exhibit.name_zh_cn }}</view>
  86. <view class="code">
  87. <text class="text">展位号:</text>
  88. <text class="code-inner">{{ exhibit.hall_booth_no }}</text>
  89. </view>
  90. <view class="button" @click="scanCodeEvent(route,r_index,e_index,exhibit)">
  91. <text :class="['iconfont',exhibit.checkin_status === 1 ?'icon-Check':'icon-saoyisao_1']"></text>
  92. <text class="text">打卡</text>
  93. </view>
  94. </view>
  95. </view>
  96. </van-collapse-item>
  97. </van-collapse>
  98. <view class="side-button">
  99. <view @click="gotoPrizes()" class="button">
  100. <text style="font-size: 50rpx;" class="iconfont icon-jiangpin"></text>
  101. <text class="title">我的奖品</text>
  102. </view>
  103. <view @click="gotoRule()" class="button">
  104. <text class="iconfont icon-xiaochengxu-canguandengjiicon"></text>
  105. <text class="title">活动规则</text>
  106. </view>
  107. <view class="button">
  108. <button open-type="share"></button>
  109. <text style="font-size: 56rpx;" class="iconfont icon-zhuanfa"></text>
  110. <text class="title">分享</text>
  111. </view>
  112. </view>
  113. </view>
  114. </view>
  115. </scroll-view>
  116. <!-- <van-overlay :show="mapShow">
  117. <view class="overlay_wrapper">
  118. <image :src="mapUrl" style="width: 90%;" mode="widthFix"></image>
  119. <view class="iconfont icon-Cancel-copy" @click="hideOverlay"></view>
  120. </view>
  121. </van-overlay>-->
  122. <van-dialog id="van-dialog"/>
  123. </page-layout>
  124. </template>
  125. <script>
  126. import PageLayout from "@/components/layout/page-layout";
  127. import NavBar from "@/components/layout/nav-bar";
  128. import UScrollView from "@/components/common/u-scroll-view";
  129. import {getRouteList, qrcodeDecode} from "@/api/checkIn";
  130. import Dialog from "@/wxcomponents/vant/dialog/dialog";
  131. import VanOverlay from '@/wxcomponents/vant/overlay/index'
  132. import VanCollapse from '@/wxcomponents/vant/collapse/index'
  133. import VanCollapseItem from '@/wxcomponents/vant/collapse-item/index'
  134. import Toast from '@/wxcomponents/vant/toast/toast';
  135. import store from "@/store";
  136. export default {
  137. components: {
  138. PageLayout,
  139. NavBar,
  140. UScrollView,
  141. VanOverlay,
  142. VanCollapse,
  143. VanCollapseItem
  144. },
  145. data() {
  146. return {
  147. scrollIntoViewId: '',
  148. scene: '',
  149. activeNames: [0],
  150. mapShow: false,
  151. mapUrl: '',
  152. current_page: true,
  153. current_unfold: -1,
  154. scroll_top: 0,
  155. is_receipts: null,
  156. routeInfoData: []
  157. };
  158. },
  159. mounted() {
  160. },
  161. onShow() {
  162. this.handleEvent();
  163. },
  164. methods: {
  165. handleEvent() {
  166. this.getRouteListEvent()
  167. },
  168. initSceneEvent() {
  169. //微信扫码进入
  170. if (this.scene) {
  171. const sceneParams = this.getSceneParamsEvent(this.scene)
  172. this.getRouteListEvent(() => {
  173. this.qrcodeDecodeEvent(this.scene, async () => {
  174. let item = {
  175. index: 0,
  176. child_index: 0
  177. }
  178. this.routeInfoData.routes.forEach((route_item, route_index) => {
  179. if (route_item.exhibitors && route_item.exhibitors.length > 0) {
  180. route_item.exhibitors.forEach((exhibitors_item, exhibitors_index) => {
  181. if (exhibitors_item.exhibitor_id === sceneParams.a) {
  182. item.index = route_index
  183. item.child_index = exhibitors_index
  184. this.$set(this.routeInfoData.routes[route_index].exhibitors[exhibitors_index], 'checkin_status', 1)
  185. }
  186. })
  187. }
  188. })
  189. this.scrollIntoViewId = '#module' + item.index;
  190. if (!(this.activeNames.includes(item.index))) {
  191. this.activeNames.push(item.index)
  192. }
  193. })
  194. })
  195. }
  196. },
  197. onChangeVanItem(val) {
  198. let index = this.activeNames.indexOf(val); // 查找数组中元素1的索引
  199. if (index !== -1) {
  200. // 如果找到了元素1,则使用splice方法删除它
  201. this.activeNames.splice(index, 1);
  202. } else {
  203. // 如果没有找到元素1,则将其添加到数组的末尾
  204. this.activeNames.push(val);
  205. }
  206. }
  207. ,
  208. onChange(event) {
  209. this.activeNames = event.detail
  210. this.$forceUpdate()
  211. }
  212. ,
  213. hideOverlay() {
  214. this.mapShow = false
  215. this.mapUrl = ''
  216. }
  217. ,
  218. showOverlayEvent(map_url) {
  219. // this.mapShow = true
  220. // this.mapUrl = map_url
  221. let map_list = []
  222. this.routeInfoData.routes.forEach(item=>{
  223. if (item.map_btn_name && item.map_url) {
  224. map_list.push(item.map_url)
  225. }
  226. })
  227. wx.previewImage({
  228. current: map_url, // 当前显示图片的http链接
  229. urls: map_list // 需要预览的图片http链接列表
  230. })
  231. }
  232. ,
  233. getSceneParamsEvent(finalStr) {
  234. const {a, t} = finalStr.split('&').reduce((obj, pair) => {
  235. const [key, value] = pair.split('=');
  236. obj[key] = Number(value) || null; // 自动转数字
  237. return obj;
  238. }, {});
  239. return {a: a, t: t}
  240. }
  241. ,
  242. scanCodeEvent(route, r_index, e_index, exhibit) {
  243. if (exhibit.checkin_status === 1) {
  244. return false
  245. }
  246. if (this.is_receipts > 0) {
  247. Dialog.alert({
  248. message: '已经确认领取奖品,不能继续打卡',
  249. }).then(() => {
  250. });
  251. return false
  252. }
  253. let that = this
  254. wx.scanCode({
  255. onlyFromCamera: true,
  256. success(res) {
  257. console.log(res, 'qrcode_res')
  258. let scene = res.path.split('scene=')
  259. const decoded = decodeURIComponent(scene[1])
  260. .replace(/\%/g, '%25'); // 防止二次解码丢失%
  261. const finalStr = decodeURIComponent(decoded);
  262. const params = that.getSceneParamsEvent(finalStr)
  263. console.log(finalStr)
  264. if (that.routeInfoData.routes[r_index].exhibitors[e_index].exhibitor_id !== params.a) {
  265. Dialog.alert({
  266. message: '该展商和此二维码不匹配',
  267. }).then(() => {
  268. });
  269. } else {
  270. that.qrcodeDecodeEvent(finalStr, () => {
  271. let curr_id = that.routeInfoData.routes[r_index].exhibitors[e_index].exhibitor_id
  272. that.routeInfoData.routes.forEach((route_item, route_index) => {
  273. if (route_item.exhibitors && route_item.exhibitors.length > 0) {
  274. route_item.exhibitors.forEach((exhibitors_item, exhibitors_index) => {
  275. if (exhibitors_item.exhibitor_id === curr_id) {
  276. that.$set(that.routeInfoData.routes[route_index].exhibitors[exhibitors_index], 'checkin_status', 1)
  277. }
  278. })
  279. }
  280. })
  281. // that.$set(that.routeInfoData.routes[r_index].exhibitors[e_index], 'checkin_status', 1)
  282. })
  283. }
  284. }
  285. })
  286. }
  287. ,
  288. qrcodeDecodeEvent(scene, callback) {
  289. qrcodeDecode({scene: scene}).then(res => {
  290. if (res.code === 0) {
  291. Toast.success('打卡成功');
  292. if (callback) {
  293. callback()
  294. }
  295. }
  296. })
  297. }
  298. ,
  299. getRouteListEvent(callback) {
  300. getRouteList().then(res => {
  301. this.is_receipts = res.data.is_receipts
  302. this.routeInfoData = res.data
  303. if (callback) {
  304. callback()
  305. }
  306. })
  307. }
  308. ,
  309. navigateBack() {
  310. uni.navigateBack(1)
  311. }
  312. ,
  313. gotoRule() {
  314. this.current_page = false
  315. this.scroll_top = 1
  316. this.$nextTick(function () {
  317. this.scroll_top = 0
  318. });
  319. }
  320. ,
  321. gotoPrizes() {
  322. uni.navigateTo({
  323. url: '/pages/user/award'
  324. })
  325. },
  326. onShareTimeline() {
  327. return {
  328. title: '逛展会,领福利!',
  329. path: '/pages/checkIn/index',
  330. imageUrl: 'https://www.productronicachina.com.cn/resources/files/0221/67b7e5190bd22/share.png'
  331. }
  332. }
  333. ,
  334. onShareAppMessage() {
  335. return {
  336. title: '逛展会,领福利!',
  337. path: '/pages/checkIn/index',
  338. imageUrl: 'https://www.productronicachina.com.cn/resources/files/0221/67b7e5190bd22/share.png'
  339. }
  340. }
  341. ,
  342. /**
  343. * 返回完成进度
  344. * @param {Object} item exhibitors_list内的数据
  345. * @param {Boolean} per 是否返回百分比 true:返回0~1之间的小数;false:返回n/n格式分数。
  346. */
  347. getProcess(item, per) {
  348. if (!item) {
  349. return 0
  350. }
  351. let length = item.length
  352. let process = 0
  353. item.forEach((value, index) => {
  354. if (value.checkin_status)
  355. process++
  356. })
  357. if (per) {
  358. return process / length
  359. } else {
  360. return process + '/' + length
  361. }
  362. }
  363. },
  364. onBackPress(options) {
  365. if (options.from === 'backbutton' || options.from === 'navigateBack') {
  366. // 这里处理手势返回事件
  367. console.log('手势返回事件触发');
  368. // 返回 true 阻止默认返回行为,返回 false 允许默认返回行为
  369. return false;
  370. }
  371. return false;
  372. },
  373. onLoad(option) {
  374. if (!store.getters.user) {
  375. this.navigateTo('/pages/user/login?redirect=' + encodeURIComponent('/pages/checkIn/checkInRoute?scene=' + option.scene))
  376. return false
  377. }
  378. this.scene = decodeURIComponent(option.scene || '');
  379. this.initSceneEvent()
  380. if (option.rule === 'true')
  381. this.gotoRule()
  382. }
  383. ,
  384. }
  385. </script>
  386. <style lang="scss">
  387. ::v-deep {
  388. .van-hairline--top, .item-index--van-hairline--top {
  389. border: none;
  390. //background-color: unset;
  391. box-shadow: unset;
  392. .item-index--van-cell {
  393. border: none;
  394. //background-color: unset;
  395. box-shadow: unset;
  396. }
  397. &:after {
  398. content: unset;
  399. }
  400. &:before {
  401. content: unset;
  402. }
  403. }
  404. }
  405. </style>
  406. <style lang="scss" scoped>
  407. ::v-deep {
  408. .van-cell, .van-collapse-item__content {
  409. border-radius: 20rpx;
  410. }
  411. .van-cell {
  412. padding-top: 66rpx;
  413. }
  414. .van-cell__right-icon-wrap {
  415. display: none;
  416. }
  417. .van-collapse-item {
  418. position: relative;
  419. padding-bottom: 48rpx;
  420. &.expand_item {
  421. .icon-Down {
  422. transform: rotate(180deg);
  423. }
  424. }
  425. .icon-Down {
  426. position: absolute;
  427. left: 0;
  428. right: 0;
  429. bottom: 0;
  430. margin: 0 auto;
  431. text-align: center;
  432. }
  433. }
  434. }
  435. .overlay_wrapper {
  436. display: flex;
  437. justify-content: center;
  438. align-items: center;
  439. width: 100%;
  440. height: 100%;
  441. position: relative;
  442. .iconfont {
  443. position: absolute;
  444. right: 30rpx;
  445. top: 250rpx;
  446. color: #ffffff;
  447. font-size: 40rpx;
  448. }
  449. }
  450. .outter {
  451. height: 100%;
  452. position: relative;
  453. .head_title {
  454. width: 100%;
  455. background: linear-gradient(270deg, #332968 9%, #435797 44%, #382E73 92%), rgba(0, 0, 0, 0.2);
  456. padding-bottom: 15px;
  457. display: flex;
  458. align-items: flex-end;
  459. padding-left: 28rpx;
  460. .title {
  461. display: flex;
  462. align-items: center;
  463. color: white;
  464. font-size: 32rpx;
  465. .iconfont {
  466. font-size: 36rpx;
  467. margin-right: 8rpx;
  468. }
  469. }
  470. }
  471. .body {
  472. overflow: hidden;
  473. overflow-y: auto;
  474. background: linear-gradient(180deg, #015A92 0%, #56A3E9 24%, #106591 98%);
  475. .router-item {
  476. position: relative;
  477. //padding: 60rpx 37rpx;
  478. border-radius: 20rpx;
  479. margin: 0 30rpx 56rpx;
  480. background-color: white;
  481. display: grid;
  482. transition-duration: 300ms;
  483. //overflow: hidden;
  484. &.fold {
  485. .item-body {
  486. padding-top: 0;
  487. }
  488. }
  489. .item-body {
  490. transition-duration: 300ms;
  491. padding-top: 40rpx;
  492. display: grid;
  493. grid-template-columns: calc(33% - 20rpx) calc(33% - 20rpx) calc(33% - 20rpx);
  494. grid-gap: 70rpx 30rpx;
  495. //overflow: hidden;
  496. color: #333333;
  497. .exhibit-item {
  498. //width: calc( 33% - 15rpx);
  499. position: relative;
  500. background-color: white;
  501. box-shadow: 0 4rpx 20rpx 0 rgba(0, 0, 0, 0.15);
  502. border-radius: 10rpx;
  503. padding: 60rpx 16rpx 16rpx;
  504. transition-duration: 300ms;
  505. display: flex;
  506. flex-direction: column;
  507. &.checked {
  508. background-color: #4085C7;
  509. color: white;
  510. .code {
  511. .text, .code-inner {
  512. color: white;
  513. }
  514. }
  515. .button {
  516. width: 38rpx;
  517. grid-gap: 0;
  518. border: 2rpx solid white;
  519. background-color: white;
  520. color: #4085C7;
  521. .text {
  522. width: 0;
  523. height: 0;
  524. }
  525. .iconfont {
  526. font-size: 30rpx;
  527. }
  528. }
  529. animation: checked 300ms;
  530. }
  531. @keyframes checked {
  532. 0% {
  533. transform: scale(1) rotate(0deg);
  534. }
  535. 50% {
  536. transform: scale(0.92) rotate(6deg);
  537. }
  538. 100% {
  539. transform: scale(1) rotate(0deg);
  540. }
  541. }
  542. .logo {
  543. background-color: white;
  544. position: absolute;
  545. left: 50%;
  546. transform: translate(-50%, -50%);
  547. top: 0;
  548. width: 76rpx;
  549. height: 76rpx;
  550. border: 1rpx solid #E1E1E1;
  551. border-radius: 6rpx;
  552. padding: 2rpx;
  553. }
  554. .name {
  555. font-size: 24rpx;
  556. font-weight: bold;
  557. margin-bottom: 10rpx;
  558. min-height: 60rpx;
  559. flex: 1;
  560. /*text-overflow: ellipsis; !*设置隐藏部分为省略号*!
  561. overflow: hidden; !*设置隐藏*!
  562. display: -webkit-box;
  563. -webkit-line-clamp: 3; !*设置显示行数,此处为2行,可设置其他数字*!
  564. -webkit-box-orient: vertical;*/
  565. }
  566. .code {
  567. transition-duration: 300ms;
  568. margin-bottom: 10rpx;
  569. display: flex;
  570. //align-items: center;
  571. flex-direction: column;
  572. .text {
  573. transition-duration: 300ms;
  574. color: #555555;
  575. font-size: 16rpx;
  576. }
  577. .code-inner {
  578. transition-duration: 300ms;
  579. color: #E57519;
  580. font-size: 24rpx;
  581. font-weight: bold;
  582. //flex: 1;
  583. min-width: 1rpx;
  584. //padding-left: 5rpx;
  585. word-break: break-word;
  586. }
  587. }
  588. .button {
  589. transition-duration: 300ms;
  590. margin: auto;
  591. width: 100%;
  592. height: 40rpx;
  593. font-size: 20rpx;
  594. border: 2rpx solid #D9D9D9;
  595. border-radius: 60rpx;
  596. display: flex;
  597. align-items: center;
  598. justify-content: center;
  599. grid-gap: 8rpx;
  600. .text {
  601. font-size: 20rpx;
  602. transition-duration: 300ms;
  603. overflow: hidden;
  604. margin-top: -4rpx;
  605. }
  606. .iconfont {
  607. transition-duration: 300ms;
  608. font-size: inherit;
  609. }
  610. }
  611. }
  612. }
  613. .item-head {
  614. .route-name {
  615. position: absolute;
  616. left: 30rpx;
  617. top: -16rpx;
  618. color: white;
  619. border: solid 6rpx white;
  620. background-color: #FF9A00;
  621. font-size: 30rpx;
  622. font-weight: bold;
  623. padding: 15rpx 30rpx;
  624. border-radius: 60rpx;
  625. width: fit-content;
  626. }
  627. .product-type {
  628. display: flex;
  629. justify-content: space-between;
  630. align-items: center;
  631. margin-top: 16rpx;
  632. .text {
  633. font-size: 32rpx;
  634. font-weight: bold;
  635. flex: 1;
  636. min-width: 1rpx;
  637. padding-right: 20rpx;
  638. }
  639. .button {
  640. color: #4085C7;
  641. border: solid 3rpx #4085C7;
  642. border-radius: 60rpx;
  643. font-size: 24rpx;
  644. padding: 10rpx 20rpx;
  645. line-height: 1;
  646. .iconfont {
  647. font-size: inherit;
  648. margin-left: 6rpx;
  649. }
  650. }
  651. }
  652. .progress {
  653. position: relative;
  654. margin-top: 24rpx;
  655. height: 36rpx;
  656. width: 100%;
  657. background-color: #EBEBEB;
  658. border-radius: 18rpx;
  659. .inner {
  660. height: 100%;
  661. width: 100%;
  662. position: relative;
  663. .inner-process {
  664. transition-duration: 300ms;
  665. position: relative;
  666. overflow: hidden;
  667. height: 100%;
  668. width: 50%;
  669. background-color: #E57519;
  670. border-radius: 18rpx;
  671. .text {
  672. transition-duration: 300ms;
  673. color: white;
  674. }
  675. }
  676. }
  677. .text {
  678. position: absolute;
  679. width: 100%;
  680. height: 100%;
  681. left: 0;
  682. top: 0;
  683. color: #555555;
  684. font-size: 20rpx;
  685. line-height: 36rpx;
  686. text-align: center;
  687. /*&.disable_text {
  688. text-align: left;
  689. left: 24rpx;
  690. }*/
  691. }
  692. }
  693. }
  694. }
  695. .pagination {
  696. margin-bottom: 57rpx;
  697. .page {
  698. overflow: hidden;
  699. position: relative;
  700. background-color: white;
  701. padding: 40rpx 50rpx;
  702. border-radius: 20rpx;
  703. margin: 0 30rpx;
  704. .page-item {
  705. font-size: 26rpx;
  706. line-height: 1.6;
  707. }
  708. .light {
  709. transition-duration: 300ms;
  710. position: absolute;
  711. background: linear-gradient(75deg, #ffffff00, #ffffff 50%, #ffffff00 100%);
  712. width: 100%;
  713. height: 100%;
  714. left: 0;
  715. top: 0;
  716. }
  717. }
  718. .page-change {
  719. display: flex;
  720. justify-content: center;
  721. .page-item {
  722. transition-duration: 300ms;
  723. font-weight: bold;
  724. font-size: 26rpx;
  725. padding: 14rpx 40rpx;
  726. background: linear-gradient(#2D2B76 50%, #FF9A00 50%);
  727. background-position: 0 0;
  728. background-size: 100% 200%;
  729. color: #ffffff99;
  730. border-radius: 20rpx 20rpx 0 0;
  731. &.active {
  732. background-position: 0 100%;
  733. color: white;
  734. }
  735. }
  736. }
  737. }
  738. .theme-title {
  739. margin-top: 54rpx;
  740. margin-bottom: 32rpx;
  741. position: relative;
  742. height: 130rpx;
  743. display: flex;
  744. justify-content: center;
  745. align-items: center;
  746. .title {
  747. color: white;
  748. font-size: 55rpx;
  749. font-weight: bold;
  750. }
  751. .title-bg {
  752. position: absolute;
  753. left: 0;
  754. top: 0;
  755. height: 100%;
  756. }
  757. }
  758. }
  759. .side-button {
  760. position: fixed;
  761. right: 32rpx;
  762. bottom: 32rpx;
  763. display: flex;
  764. flex-direction: column;
  765. grid-gap: 17rpx;
  766. .button {
  767. background-color: white;
  768. width: 125rpx;
  769. height: 125rpx;
  770. border-radius: 50%;
  771. box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.25);
  772. display: flex;
  773. flex-direction: column;
  774. justify-content: center;
  775. align-items: center;
  776. grid-gap: 6rpx;
  777. padding-bottom: 6rpx;
  778. position: relative;
  779. button {
  780. width: 100%;
  781. height: 100%;
  782. opacity: 0;
  783. left: 0;
  784. top: 0;
  785. position: absolute;
  786. }
  787. .title {
  788. color: #94A3B8;
  789. font-size: 24rpx;
  790. }
  791. .iconfont {
  792. font-size: 60rpx;
  793. color: #016BF3;
  794. }
  795. }
  796. }
  797. }
  798. </style>