checkInRoute.vue 24 KB

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