checkInRoute.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  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" @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 draggable :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. this.getRouteListEvent()
  161. },
  162. methods: {
  163. initSceneEvent() {
  164. //微信扫码进入
  165. if (this.scene) {
  166. const sceneParams = this.getSceneParamsEvent(this.scene)
  167. this.getRouteListEvent(() => {
  168. this.qrcodeDecodeEvent(this.scene, async () => {
  169. let item = {
  170. index: 0,
  171. child_index: 0
  172. }
  173. this.routeInfoData.routes.forEach((route_item, route_index) => {
  174. if (route_item.exhibitors && route_item.exhibitors.length > 0) {
  175. route_item.exhibitors.forEach((exhibitors_item, exhibitors_index) => {
  176. if (exhibitors_item.exhibitor_id === sceneParams.a) {
  177. item.index = route_index
  178. item.child_index = exhibitors_index
  179. this.$set(this.routeInfoData.routes[route_index].exhibitors[exhibitors_index], 'checkin_status', 1)
  180. }
  181. })
  182. }
  183. })
  184. this.scrollIntoViewId = '#module' + item.index;
  185. if (!(this.activeNames.includes(item.index))) {
  186. this.activeNames.push(item.index)
  187. }
  188. })
  189. })
  190. }
  191. },
  192. onChangeVanItem(val) {
  193. let index = this.activeNames.indexOf(val); // 查找数组中元素1的索引
  194. if (index !== -1) {
  195. // 如果找到了元素1,则使用splice方法删除它
  196. this.activeNames.splice(index, 1);
  197. } else {
  198. // 如果没有找到元素1,则将其添加到数组的末尾
  199. this.activeNames.push(val);
  200. }
  201. }
  202. ,
  203. onChange(event) {
  204. this.activeNames = event.detail
  205. this.$forceUpdate()
  206. }
  207. ,
  208. hideOverlay() {
  209. this.mapShow = false
  210. this.mapUrl = ''
  211. }
  212. ,
  213. showOverlayEvent(map_url) {
  214. this.mapShow = true
  215. this.mapUrl = map_url
  216. }
  217. ,
  218. getSceneParamsEvent(finalStr) {
  219. const {a, t} = finalStr.split('&').reduce((obj, pair) => {
  220. const [key, value] = pair.split('=');
  221. obj[key] = Number(value) || null; // 自动转数字
  222. return obj;
  223. }, {});
  224. return {a: a, t: t}
  225. }
  226. ,
  227. scanCodeEvent(route, r_index, e_index, exhibit) {
  228. if (exhibit.checkin_status === 1) {
  229. return false
  230. }
  231. if (this.is_receipts > 0) {
  232. Dialog.alert({
  233. message: '已经确认领取奖品,不能继续打卡',
  234. }).then(() => {
  235. });
  236. return false
  237. }
  238. let that = this
  239. wx.scanCode({
  240. onlyFromCamera: true,
  241. success(res) {
  242. console.log(res, 'qrcode_res')
  243. let scene = res.path.split('scene=')
  244. const decoded = decodeURIComponent(scene[1])
  245. .replace(/\%/g, '%25'); // 防止二次解码丢失%
  246. const finalStr = decodeURIComponent(decoded);
  247. const params = that.getSceneParamsEvent(finalStr)
  248. console.log(finalStr)
  249. if (that.routeInfoData.routes[r_index].exhibitors[e_index].exhibitor_id !== params.a) {
  250. Dialog.alert({
  251. message: '该展商和打卡二维码数据不一致',
  252. }).then(() => {
  253. });
  254. } else {
  255. that.qrcodeDecodeEvent(finalStr, () => {
  256. let curr_id = that.routeInfoData.routes[r_index].exhibitors[e_index].exhibitor_id
  257. that.routeInfoData.routes.forEach((route_item, route_index) => {
  258. if (route_item.exhibitors && route_item.exhibitors.length > 0) {
  259. route_item.exhibitors.forEach((exhibitors_item, exhibitors_index) => {
  260. if (exhibitors_item.exhibitor_id === curr_id) {
  261. that.$set(that.routeInfoData.routes[route_index].exhibitors[exhibitors_index], 'checkin_status', 1)
  262. }
  263. })
  264. }
  265. })
  266. // that.$set(that.routeInfoData.routes[r_index].exhibitors[e_index], 'checkin_status', 1)
  267. })
  268. }
  269. }
  270. })
  271. }
  272. ,
  273. qrcodeDecodeEvent(scene, callback) {
  274. qrcodeDecode({scene: scene}).then(res => {
  275. if (res.code === 0) {
  276. Toast.success('打卡成功');
  277. if (callback) {
  278. callback()
  279. }
  280. }
  281. })
  282. }
  283. ,
  284. getRouteListEvent(callback) {
  285. getRouteList().then(res => {
  286. this.is_receipts = res.data.is_receipts
  287. this.routeInfoData = res.data
  288. if (callback) {
  289. callback()
  290. }
  291. })
  292. }
  293. ,
  294. navigateBack() {
  295. uni.navigateBack(1)
  296. }
  297. ,
  298. gotoRule() {
  299. this.current_page = false
  300. this.scroll_top = 1
  301. this.$nextTick(function () {
  302. this.scroll_top = 0
  303. });
  304. }
  305. ,
  306. gotoPrizes() {
  307. uni.navigateTo({
  308. url: '/pages/user/award'
  309. })
  310. },
  311. onShareTimeline() {
  312. return {
  313. title: '逛展会,领福利!',
  314. path: '/pages/checkIn/index',
  315. imageUrl: 'https://www.productronicachina.com.cn/resources/files/0221/67b7e5190bd22/share.png'
  316. }
  317. }
  318. ,
  319. onShareAppMessage() {
  320. return {
  321. title: '逛展会,领福利!',
  322. path: '/pages/checkIn/index',
  323. imageUrl: 'https://www.productronicachina.com.cn/resources/files/0221/67b7e5190bd22/share.png'
  324. }
  325. }
  326. ,
  327. /**
  328. * 返回完成进度
  329. * @param {Object} item exhibitors_list内的数据
  330. * @param {Boolean} per 是否返回百分比 true:返回0~1之间的小数;false:返回n/n格式分数。
  331. */
  332. getProcess(item, per) {
  333. if (!item) {
  334. return 0
  335. }
  336. let length = item.length
  337. let process = 0
  338. item.forEach((value, index) => {
  339. if (value.checkin_status)
  340. process++
  341. })
  342. if (per) {
  343. return process / length
  344. } else {
  345. return process + '/' + length
  346. }
  347. }
  348. },
  349. onLoad(option) {
  350. if (!store.getters.user) {
  351. this.navigateTo('/pages/user/login?redirect=' + encodeURIComponent('/pages/checkIn/checkInRoute?scene=' + option.scene))
  352. return false
  353. }
  354. this.scene = decodeURIComponent(option.scene || '');
  355. console.log(this.scene, 'option_this.scene')
  356. this.initSceneEvent()
  357. if (option.rule === 'true')
  358. this.gotoRule()
  359. }
  360. ,
  361. }
  362. </script>
  363. <style lang="scss">
  364. ::v-deep {
  365. .van-hairline--top, .item-index--van-hairline--top {
  366. border: none;
  367. //background-color: unset;
  368. box-shadow: unset;
  369. .item-index--van-cell {
  370. border: none;
  371. //background-color: unset;
  372. box-shadow: unset;
  373. }
  374. &:after {
  375. content: unset;
  376. }
  377. &:before {
  378. content: unset;
  379. }
  380. }
  381. }
  382. </style>
  383. <style lang="scss" scoped>
  384. ::v-deep {
  385. .van-cell, .van-collapse-item__content {
  386. border-radius: 20rpx;
  387. }
  388. .van-cell {
  389. padding-top: 66rpx;
  390. }
  391. .van-cell__right-icon-wrap {
  392. display: none;
  393. }
  394. .van-collapse-item {
  395. position: relative;
  396. padding-bottom: 48rpx;
  397. &.expand_item {
  398. .icon-Down {
  399. transform: rotate(180deg);
  400. }
  401. }
  402. .icon-Down {
  403. position: absolute;
  404. left: 0;
  405. right: 0;
  406. bottom: 0;
  407. margin: 0 auto;
  408. text-align: center;
  409. }
  410. }
  411. }
  412. .overlay_wrapper {
  413. display: flex;
  414. justify-content: center;
  415. align-items: center;
  416. width: 100%;
  417. height: 100%;
  418. position: relative;
  419. .iconfont {
  420. position: absolute;
  421. right: 30rpx;
  422. top: 250rpx;
  423. color: #ffffff;
  424. font-size: 40rpx;
  425. }
  426. }
  427. .outter {
  428. height: 100%;
  429. position: relative;
  430. .head_title {
  431. width: 100%;
  432. background: linear-gradient(270deg, #332968 9%, #435797 44%, #382E73 92%), rgba(0, 0, 0, 0.2);
  433. padding-bottom: 15px;
  434. display: flex;
  435. align-items: flex-end;
  436. padding-left: 28rpx;
  437. .title {
  438. display: flex;
  439. align-items: center;
  440. color: white;
  441. font-size: 32rpx;
  442. .iconfont {
  443. font-size: 36rpx;
  444. margin-right: 8rpx;
  445. }
  446. }
  447. }
  448. .body {
  449. overflow: hidden;
  450. overflow-y: auto;
  451. background: linear-gradient(180deg, #015A92 0%, #56A3E9 24%, #106591 98%);
  452. .router-item {
  453. position: relative;
  454. //padding: 60rpx 37rpx;
  455. border-radius: 20rpx;
  456. margin: 0 30rpx 56rpx;
  457. background-color: white;
  458. display: grid;
  459. transition-duration: 300ms;
  460. //overflow: hidden;
  461. &.fold {
  462. .item-body {
  463. padding-top: 0;
  464. }
  465. }
  466. .item-body {
  467. transition-duration: 300ms;
  468. padding-top: 40rpx;
  469. display: grid;
  470. grid-template-columns: calc(33% - 20rpx) calc(33% - 20rpx) calc(33% - 20rpx);
  471. grid-gap: 70rpx 30rpx;
  472. //overflow: hidden;
  473. color: #333333;
  474. .exhibit-item {
  475. //width: calc( 33% - 15rpx);
  476. position: relative;
  477. background-color: white;
  478. box-shadow: 0 4rpx 20rpx 0 rgba(0, 0, 0, 0.15);
  479. border-radius: 10rpx;
  480. padding: 60rpx 16rpx 16rpx;
  481. transition-duration: 300ms;
  482. display: flex;
  483. flex-direction: column;
  484. &.checked {
  485. background-color: #4085C7;
  486. color: white;
  487. .code {
  488. .text, .code-inner {
  489. color: white;
  490. }
  491. }
  492. .button {
  493. width: 38rpx;
  494. grid-gap: 0;
  495. border: 2rpx solid white;
  496. background-color: white;
  497. color: #4085C7;
  498. .text {
  499. width: 0;
  500. height: 0;
  501. }
  502. .iconfont {
  503. font-size: 30rpx;
  504. }
  505. }
  506. animation: checked 300ms;
  507. }
  508. @keyframes checked {
  509. 0% {
  510. transform: scale(1) rotate(0deg);
  511. }
  512. 50% {
  513. transform: scale(0.92) rotate(6deg);
  514. }
  515. 100% {
  516. transform: scale(1) rotate(0deg);
  517. }
  518. }
  519. .logo {
  520. background-color: white;
  521. position: absolute;
  522. left: 50%;
  523. transform: translate(-50%, -50%);
  524. top: 0;
  525. width: 76rpx;
  526. height: 76rpx;
  527. border: 1rpx solid #E1E1E1;
  528. border-radius: 6rpx;
  529. padding: 2rpx;
  530. }
  531. .name {
  532. font-size: 24rpx;
  533. font-weight: bold;
  534. margin-bottom: 10rpx;
  535. min-height: 60rpx;
  536. flex: 1;
  537. /*text-overflow: ellipsis; !*设置隐藏部分为省略号*!
  538. overflow: hidden; !*设置隐藏*!
  539. display: -webkit-box;
  540. -webkit-line-clamp: 3; !*设置显示行数,此处为2行,可设置其他数字*!
  541. -webkit-box-orient: vertical;*/
  542. }
  543. .code {
  544. transition-duration: 300ms;
  545. margin-bottom: 10rpx;
  546. display: flex;
  547. //align-items: center;
  548. flex-direction: column;
  549. .text {
  550. transition-duration: 300ms;
  551. color: #555555;
  552. font-size: 16rpx;
  553. }
  554. .code-inner {
  555. transition-duration: 300ms;
  556. color: #E57519;
  557. font-size: 24rpx;
  558. font-weight: bold;
  559. //flex: 1;
  560. min-width: 1rpx;
  561. //padding-left: 5rpx;
  562. word-break: break-word;
  563. }
  564. }
  565. .button {
  566. transition-duration: 300ms;
  567. margin: auto;
  568. width: 100%;
  569. height: 40rpx;
  570. font-size: 20rpx;
  571. border: 2rpx solid #D9D9D9;
  572. border-radius: 60rpx;
  573. display: flex;
  574. align-items: center;
  575. justify-content: center;
  576. grid-gap: 8rpx;
  577. .text {
  578. font-size: 20rpx;
  579. transition-duration: 300ms;
  580. overflow: hidden;
  581. margin-top: -4rpx;
  582. }
  583. .iconfont {
  584. transition-duration: 300ms;
  585. font-size: inherit;
  586. }
  587. }
  588. }
  589. }
  590. .item-head {
  591. .route-name {
  592. position: absolute;
  593. left: 30rpx;
  594. top: -16rpx;
  595. color: white;
  596. border: solid 6rpx white;
  597. background-color: #FF9A00;
  598. font-size: 30rpx;
  599. font-weight: bold;
  600. padding: 15rpx 30rpx;
  601. border-radius: 60rpx;
  602. width: fit-content;
  603. }
  604. .product-type {
  605. display: flex;
  606. justify-content: space-between;
  607. align-items: center;
  608. margin-top: 16rpx;
  609. .text {
  610. font-size: 32rpx;
  611. font-weight: bold;
  612. flex: 1;
  613. min-width: 1rpx;
  614. padding-right: 20rpx;
  615. }
  616. .button {
  617. color: #4085C7;
  618. border: solid 3rpx #4085C7;
  619. border-radius: 60rpx;
  620. font-size: 24rpx;
  621. padding: 10rpx 20rpx;
  622. line-height: 1;
  623. .iconfont {
  624. font-size: inherit;
  625. margin-left: 6rpx;
  626. }
  627. }
  628. }
  629. .progress {
  630. position: relative;
  631. margin-top: 24rpx;
  632. height: 36rpx;
  633. width: 100%;
  634. background-color: #EBEBEB;
  635. border-radius: 18rpx;
  636. .inner {
  637. height: 100%;
  638. width: 100%;
  639. position: relative;
  640. .inner-process {
  641. transition-duration: 300ms;
  642. position: relative;
  643. overflow: hidden;
  644. height: 100%;
  645. width: 50%;
  646. background-color: #E57519;
  647. border-radius: 18rpx;
  648. .text {
  649. transition-duration: 300ms;
  650. color: white;
  651. }
  652. }
  653. }
  654. .text {
  655. position: absolute;
  656. width: 100%;
  657. height: 100%;
  658. left: 0;
  659. top: 0;
  660. color: #555555;
  661. font-size: 20rpx;
  662. line-height: 36rpx;
  663. text-align: center;
  664. /*&.disable_text {
  665. text-align: left;
  666. left: 24rpx;
  667. }*/
  668. }
  669. }
  670. }
  671. }
  672. .pagination {
  673. margin-bottom: 57rpx;
  674. .page {
  675. overflow: hidden;
  676. position: relative;
  677. background-color: white;
  678. padding: 40rpx 50rpx;
  679. border-radius: 20rpx;
  680. margin: 0 30rpx;
  681. .page-item {
  682. font-size: 26rpx;
  683. line-height: 1.6;
  684. }
  685. .light {
  686. transition-duration: 300ms;
  687. position: absolute;
  688. background: linear-gradient(75deg, #ffffff00, #ffffff 50%, #ffffff00 100%);
  689. width: 100%;
  690. height: 100%;
  691. left: 0;
  692. top: 0;
  693. }
  694. }
  695. .page-change {
  696. display: flex;
  697. justify-content: center;
  698. .page-item {
  699. transition-duration: 300ms;
  700. font-weight: bold;
  701. font-size: 26rpx;
  702. padding: 14rpx 40rpx;
  703. background: linear-gradient(#2D2B76 50%, #FF9A00 50%);
  704. background-position: 0 0;
  705. background-size: 100% 200%;
  706. color: #ffffff99;
  707. border-radius: 20rpx 20rpx 0 0;
  708. &.active {
  709. background-position: 0 100%;
  710. color: white;
  711. }
  712. }
  713. }
  714. }
  715. .theme-title {
  716. margin-top: 54rpx;
  717. margin-bottom: 32rpx;
  718. position: relative;
  719. height: 130rpx;
  720. display: flex;
  721. justify-content: center;
  722. align-items: center;
  723. .title {
  724. color: white;
  725. font-size: 55rpx;
  726. font-weight: bold;
  727. }
  728. .title-bg {
  729. position: absolute;
  730. left: 0;
  731. top: 0;
  732. height: 100%;
  733. }
  734. }
  735. }
  736. .side-button {
  737. position: fixed;
  738. right: 32rpx;
  739. bottom: 32rpx;
  740. display: flex;
  741. flex-direction: column;
  742. grid-gap: 17rpx;
  743. .button {
  744. background-color: white;
  745. width: 125rpx;
  746. height: 125rpx;
  747. border-radius: 50%;
  748. box-shadow: 0px 0px 20px 0px rgba(0, 0, 0, 0.25);
  749. display: flex;
  750. flex-direction: column;
  751. justify-content: center;
  752. align-items: center;
  753. grid-gap: 6rpx;
  754. padding-bottom: 6rpx;
  755. position: relative;
  756. button {
  757. width: 100%;
  758. height: 100%;
  759. opacity: 0;
  760. left: 0;
  761. top: 0;
  762. position: absolute;
  763. }
  764. .title {
  765. color: #94A3B8;
  766. font-size: 24rpx;
  767. }
  768. .iconfont {
  769. font-size: 60rpx;
  770. color: #016BF3;
  771. }
  772. }
  773. }
  774. }
  775. </style>