goods.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. <template>
  2. <app-layout>
  3. <view v-if="!goods" class="u-goods-detail"></view>
  4. <template v-else>
  5. <view class="goods-head-box">
  6. <app-goods-banner :pic-list="goods.pic_url" :share="goods.share"
  7. :goods_id="lottery_id"
  8. sign="lottery"
  9. :video-url="goods.video_url"></app-goods-banner>
  10. <view class="time main-center">
  11. <view v-if="user_log === null || user_log.status <= 1"
  12. class="time-info dir-left-nowrap cross-center">
  13. <icon class="icon" type></icon>
  14. <view v-if="new_status == 2">距活动开始:</view>
  15. <view v-else>距活动结束:</view>
  16. <text v-if="times.day>0 || times.hour>0">{{times.day}}天{{times.hour}}小时</text>
  17. <text v-if="times.day==0 && times.hour==0">{{times.minute}}分{{times.second}}秒</text>
  18. </view>
  19. <view v-else class="time-info time-error dir-left-nowrap cross-center">
  20. <icon class="icon" type></icon>
  21. <view>活动已结束</view>
  22. </view>
  23. </view>
  24. </view>
  25. <view class="goods" v-if="goods">
  26. <view class="u-line-2 name">{{goods.name}}</view>
  27. <view v-if="goods.subtitle" class="goods-subtitle">
  28. <view class="t-omit-three">{{goods.subtitle}}</view>
  29. </view>
  30. <view class="dir-left-nowrap">
  31. <view class="detail box-grow-1">
  32. <view class="dir-left-nowrap box-grow-0">
  33. <text>共</text>
  34. <text class="bold">{{lottery.stock}}</text>
  35. <text>份</text>
  36. <view class="num">{{goods.num}}人参与</view>
  37. </view>
  38. <view class="price dir-left-nowrap box-grow-0">
  39. <view class="box-grow-0">免费</view>
  40. <view class="box-grow-0 del" v-if="isUnderlinePrice">售价¥{{goods.original_price}}</view>
  41. </view>
  42. </view>
  43. <view @click="shareClick"
  44. :style="{'background-color': getTheme.background}"
  45. class="share dir-left-nowrap main-center cross-center">
  46. <image class="share-icon box-grow-0" src="/static/image/icon/icon-share-white.png"></image>
  47. <text class="share-text box-grow-0">分享</text>
  48. </view>
  49. <app-share-qr-code :url="poster + `&goods_id=` + goods.id"
  50. :has-poster-nav="true"
  51. :poster-config="poster_config + `&goods_id=` + goods.id"
  52. :poster-generate="poster_generate + `&goods_id=` + goods.id"
  53. v-model="shareShow"
  54. :goods="goods"
  55. @share="hShareAppMessage"
  56. ></app-share-qr-code>
  57. </view>
  58. </view>
  59. <!-- 规格信息 -->
  60. <view class="lottery-attr">
  61. <view class="box cross-center">
  62. <view class="border box-grow-0">商品信息</view>
  63. <view class="text dir-left-wrap t-omit">
  64. <block v-for="(value,key) in goods.attr_list" :key="key">
  65. <text>{{value.attr_group_name}}:{{value.attr_name}}</text>
  66. </block>
  67. </view>
  68. </view>
  69. </view>
  70. <view @click="qrcode" class="lottery-share" v-if="setting.cs_status ===1 && setting.cs_prompt_pic">
  71. <image :src="setting.cs_prompt_pic" mode="aspectFit" load-lazy></image>
  72. </view>
  73. <view class="step cross-center dir-left-nowrap" @click="rule">
  74. <view class="box-grow-1">抽奖流程</view>
  75. <view class="cross-center">
  76. <icon class="icon-right box-grow-0" type></icon>
  77. </view>
  78. </view>
  79. <view class="step-info dir-left-nowrap">
  80. <block v-for="(v,k) in rule_list" :key="k">
  81. <view class="box-grow-1 dir-left-nowrap main-center cross-center">
  82. <view class="label">{{v.key}}</view>
  83. <text class="value">{{v.value}}</text>
  84. </view>
  85. </block>
  86. </view>
  87. <view v-if="lucky_list" class="dir-top-nowrap lucky-all">
  88. <view class='box-grow-1'>实时幸运码</view>
  89. <view class='box-grow-1 friend'>邀请好友参与,额外获赠幸运码,提高中奖率哦!</view>
  90. <swiper v-if="lucky_list.length" class='swiper' :class="[lucky_list.length > 1?'':'swiper-one']"
  91. :display-multiple-items="lucky_list.length > 1 ? 2: 1" vertical="true"
  92. autoplay="true"
  93. interval="2000" duration="500" circular="true">
  94. <block v-for="(v,k) in lucky_list" :key="k">
  95. <swiper-item style="height: 50%" @touchmove='catchTouchMove'>
  96. <view class="dir-left cross-center lucky-code">
  97. <image class="box-grow-0" :src="v.user.userInfo.avatar" load-lazy></image>
  98. <view class="box-grow-1 t-omit nickname">{{v.user.nickname}}</view>
  99. <view class="box-grow-0 font-normal">{{v.lucky_num}}个幸运码</view>
  100. </view>
  101. </swiper-item>
  102. </block>
  103. </swiper>
  104. </view>
  105. <!-- <bd-kb-->
  106. <!-- :limit="detail.goods_marketing.limit"-->
  107. <!-- :express="detail.express"-->
  108. <!-- :shipping="detail.goods_marketing.shipping"-->
  109. <!-- :pickup="detail.goods_marketing.pickup"-->
  110. <!-- ></bd-kb>-->
  111. <!-- <view class="app-goods-marketing">-->
  112. <!-- <app-goods-marketing :express="goods.express"></app-goods-marketing>-->
  113. <!-- </view>-->
  114. <view class="goods-rule">商品详情</view>
  115. <view class="rule-info">
  116. <app-rich-text :content="goods.detail"></app-rich-text>
  117. </view>
  118. <!-- 底部空格 -->
  119. <view class="safe-area-inset-bottom">
  120. <view class="u-bottom-height"></view>
  121. </view>
  122. <!-- 底部按钮 -->
  123. <view class="safe-area-inset-bottom u-bottom-fixed">
  124. <view class='bd-bottom main-center cross-center'>
  125. <view class='bd-btn bd-bottom-first' :style="{'background-color': getTheme.background_s,'color': getTheme.secondary_text}" @click='buyNow'>直接购买</view>
  126. <view v-if="new_status == 2" class="bd-btn bd-btn-end bd-color">尚未开始</view>
  127. <view v-else-if="lottery.type == 1" class="bd-btn bd-btn-end bd-color">已结束</view>
  128. <view v-else-if="lottery.status == 0" class="bd-btn bd-btn-end bd-color">已关闭</view>
  129. <view v-else-if="user_log == null" class="bd-btn bd-color" :style="{'background-color': getTheme.background,'color': getTheme.main_text}"
  130. @click='validateIntegral'>立即抽奖
  131. </view>
  132. <view v-else-if="user_log.status <= 1" class="bd-btn bd-btn-end bd-color">已参与</view>
  133. <view v-else class="bd-btn bd-btn-end bd-color">已结束</view>
  134. </view>
  135. </view>
  136. <view v-if="award_bg" class="animation-model main-center cross-center">
  137. <u-mask :maskClickAble="false" :show="award_bg"></u-mask>
  138. <view @click="prize" class="main-center detaill" @touchmove.stop.prevent>
  139. <view class="ani_box" :animation="animation_trans_lottery">
  140. <image :src="appImg.lottery_box"></image>
  141. </view>
  142. </view>
  143. <image class="boxbg" :src="appImg.lottery_boxbg" @touchmove.stop.prevent></image>
  144. </view>
  145. </template>
  146. <integral-model ref="integralModel" :text="lottery.deplete_integral_num + '积分'" @next="subscribe"></integral-model>
  147. </app-layout>
  148. </template>
  149. <script>
  150. import {mapState, mapGetters} from 'vuex';
  151. import appQuickNavigation from "../../../components/page-component/app-quick-navigation/app-quick-navigation";
  152. import appRichText from "../../../components/basic-component/app-rich/parse.vue";
  153. import appGoodsBanner from "../../../components/page-component/goods/app-goods-banner.vue";
  154. import appShareQrCode from '../../../components/page-component/app-share-qr-code-poster/app-share-qr-code-poster.vue';
  155. import uMask from '../../../components/basic-component/u-mask/u-mask.vue';
  156. import integralModel from "../integral-model.vue";
  157. export default {
  158. name: "goods",
  159. components: {
  160. appQuickNavigation,
  161. appRichText, appGoodsBanner,
  162. appShareQrCode,
  163. uMask,
  164. integralModel
  165. },
  166. computed: {
  167. ...mapGetters('mallConfig', {
  168. getTheme: 'getTheme',
  169. }),
  170. ...mapState({
  171. appImg: state => state.mallConfig.plugin.lottery.app_image,
  172. isUnderlinePrice: state => state.mallConfig.mall.setting.is_underline_price,
  173. userInfo: state => state.user.info,
  174. })
  175. },
  176. data() {
  177. let integral_time, integral_animation;
  178. return {
  179. integral_time,
  180. integral_animation,
  181. animation_trans_lottery: null,
  182. rule_list: [
  183. {key: 1, value: "参与\n抽奖"},
  184. {key: 2, value: "等待\n开奖"},
  185. {key: 3, value: "幸运\n中奖"},
  186. {key: 4, value: "下单\n收礼"}
  187. ],
  188. times: {},
  189. poster: this.$api.lottery.poster,
  190. user_log: null,
  191. lottery: null,
  192. goods: null,
  193. lucky_list: null,
  194. lottery_id: '',
  195. award_bg: '',
  196. shareShow: false,
  197. setting: {},
  198. new_status: 0,
  199. template_message: null,
  200. poster_config: this.$api.lottery.poster_config,
  201. poster_generate: this.$api.lottery.poster_generate,
  202. }
  203. },
  204. onHide() {
  205. clearInterval(this.integral_time)
  206. },
  207. onUnload() {
  208. clearInterval(this.integral_time);
  209. },
  210. // #ifdef MP-WEIXIN
  211. onShareTimeline() {
  212. return this.$shareTimeline({
  213. title: this.goods.app_share_title ? this.goods.app_share_title : this.goods.name,
  214. imageUrl: this.goods.app_share_pic,
  215. query: {
  216. lottery_id: this.lottery_id,
  217. }
  218. });
  219. },
  220. // #endif
  221. onLoad(options) {
  222. this.$commonLoad.onload(options);
  223. var that = this;
  224. that.$event.on(that.$const.EVENT_USER_LOGIN).then(() => {
  225. that.start(options);
  226. });
  227. that.start(options);
  228. },
  229. // #ifdef MP
  230. onShareAppMessage() {
  231. return this.hShareAppMessage();
  232. },
  233. // #endif
  234. methods: {
  235. start(options) {
  236. this.lottery_id = options.lottery_id;
  237. // #ifdef MP-WEIXIN
  238. wx.showShareMenu({
  239. withShareTicket: true,
  240. menus: ['shareAppMessage', 'shareTimeline']
  241. })
  242. // #endif
  243. this.getSetting();
  244. this.clerk(options.user_id);
  245. this.$showLoading({title: '加载中'});
  246. this.$request({
  247. url: this.$api.lottery.goods,
  248. data: {
  249. lottery_id: this.lottery_id
  250. }
  251. }).then(info => {
  252. this.$hideLoading();
  253. if (info.code === 0) {
  254. [
  255. this.goods,
  256. this.lottery,
  257. this.lucky_list,
  258. this.user_log,
  259. this.new_status,
  260. this.template_message,
  261. ] = [
  262. info.data.goods,
  263. info.data.lottery,
  264. info.data.lucky_list,
  265. info.data.user_log,
  266. info.data.new_status,
  267. info.data.template_message,
  268. ];
  269. // #ifdef H5
  270. this.hShareAppMessage();
  271. // #endif
  272. uni.setNavigationBarTitle({
  273. title: this.goods.name
  274. });
  275. this.setTimeStart(this.new_status == 2 ? this.lottery.start_at : this.lottery.end_at);
  276. } else {
  277. uni.showToast({icon: 'none', title: info.msg});
  278. }
  279. }).catch(() => {
  280. this.$hideLoading();
  281. });
  282. },
  283. hShareAppMessage(s = false) {
  284. return this.$shareAppMessage({
  285. title: this.goods.app_share_title ? this.goods.app_share_title : this.goods.name,
  286. imageUrl: this.goods.app_share_pic ? this.goods.app_share_pic : this.goods.pic_url[0].pic_url,
  287. path: '/plugins/lottery/goods/goods',
  288. desc: this.goods.subtitle,
  289. params: {
  290. lottery_id: this.lottery.id,
  291. }
  292. }, s);
  293. },
  294. qrcode() {
  295. uni.navigateTo({url: `/plugins/lottery/qrcode/qrcode`})
  296. },
  297. validateIntegral() {
  298. let deplete_integral_num = Number(this.lottery.deplete_integral_num);
  299. if (deplete_integral_num > 0) {
  300. this.$refs.integralModel.showModel();
  301. } else {
  302. this.subscribe();
  303. }
  304. },
  305. prize() {
  306. uni.navigateTo({url: `/plugins/lottery/detail/detail?lottery_id=` + this.lottery.id});
  307. clearInterval(this.lotteryInter);
  308. this.award_bg = false;
  309. },
  310. rule() {
  311. uni.navigateTo({
  312. url: `/pages/rules/index?url=${encodeURIComponent(this.$api.lottery.setting)}&keys=${JSON.stringify(['setting', 'rule'])}`,
  313. });
  314. },
  315. catchTouchMove() {
  316. return false;
  317. },
  318. getSetting: function () {
  319. const self = this;
  320. self.$request({
  321. url: self.$api.lottery.setting,
  322. }).then(info => {
  323. if (info.code === 0) {
  324. self.setting = info.data.setting;
  325. }
  326. });
  327. },
  328. clerk(user_id) {
  329. const self = this;
  330. if (!user_id) return
  331. self.$request({
  332. url: self.$api.lottery.clerk,
  333. data: {
  334. user_id,
  335. lottery_id: self.lottery_id,
  336. },
  337. method: 'POST',
  338. });
  339. },
  340. setTimeStart(info) {
  341. const self = this;
  342. clearInterval(self.integral_time);
  343. let func = function (info) {
  344. let time = info.replace(/-/g, '/');
  345. let diff_time = parseInt((new Date(time).getTime() - new Date().getTime()) / 1000);
  346. let day = 0, hour = 0, minute = 0, second = 0;
  347. if (diff_time > 0) {
  348. day = Math.floor(diff_time / (60 * 60 * 24));
  349. hour = Math.floor(diff_time / (60 * 60)) - (day * 24);
  350. minute = Math.floor(diff_time / 60) - (day * 24 * 60) - (hour * 60);
  351. second = Math.floor(diff_time) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
  352. }
  353. self.times = {day, hour, minute, second};
  354. if (self.times <= 0) {
  355. clearInterval(self.integral_time)
  356. }
  357. };
  358. func(info);
  359. self.integral_time = setInterval(() => {
  360. func(info)
  361. }, 1000)
  362. },
  363. subscribe: function () {
  364. if (this.award_bg) return;
  365. const self = this;
  366. self.$subscribe(this.template_message).then(res => {
  367. self.buyZero();
  368. }).catch(res => {
  369. self.buyZero();
  370. });
  371. },
  372. buyZero: function () {
  373. const self = this;
  374. self.award_bg = !self.award_bg;
  375. setTimeout(() => {
  376. let animation = uni.createAnimation({
  377. duration: 500,
  378. timingFunction: 'linear',
  379. delay: 0,
  380. transformOrigin: '50% 50%',
  381. })
  382. if (self.award_bg) {
  383. animation.width( `${uni.upx2px(360)}px`).height(`${uni.upx2px(314)}px`).step();
  384. } else {
  385. animation.scale(0, 0).opacity(0).step();
  386. }
  387. self.animation_trans_lottery = animation.export();
  388. setTimeout(() => {
  389. let circleCount = 0;
  390. self.integral_animation = setInterval(() => {
  391. if (circleCount % 2 === 0) {
  392. animation.scale(0.9).opacity(1).step();
  393. } else {
  394. animation.scale(1).opacity(1).step();
  395. }
  396. self.animation_trans_lottery = animation.export();
  397. circleCount++;
  398. if (circleCount === 500) {
  399. circleCount = 0;
  400. }
  401. }, 500);
  402. }, 500)
  403. }, 50)
  404. },
  405. detail() {
  406. clearInterval(this.integral_animation);
  407. this.award_bg = false
  408. },
  409. onImageListClick(e) {
  410. let urls = [];
  411. let index = e.currentTarget.dataset.index;
  412. for (let i in this.goods.pic_url) {
  413. urls.push(this.goods.pic_url[i].pic_url);
  414. }
  415. uni.previewImage({
  416. urls: urls, // 需要预览的图片http链接列表
  417. current: urls[index],
  418. });
  419. },
  420. buyNow: function () {
  421. uni.navigateTo({url: `/pages/goods/goods?id=` + this.lottery.buy_goods_id})
  422. },
  423. shareClick() {
  424. this.shareShow = true;
  425. }
  426. }
  427. }
  428. </script>
  429. <style scoped lang="scss">
  430. .lottery-attr {
  431. background: #ffffff;
  432. width: 702upx;
  433. margin: 0 24upx 24upx 24upx;
  434. border-radius: 0 0 15upx 15upx;
  435. .box {
  436. border-top: 1px solid #e2e2e2;
  437. padding: 28upx 20upx;
  438. }
  439. .border {
  440. border: 1px solid #666666;
  441. border-radius: #{20rpx};
  442. font-size: #{24rpx};
  443. line-height: 1;
  444. padding: #{8rpx} #{16rpx};
  445. color: #666666;
  446. }
  447. .text {
  448. margin-left: #{24rpx};
  449. color: #353535;
  450. font-size: #{26rpx};
  451. max-width: #{520rpx};
  452. text:after {
  453. content: ','
  454. }
  455. text:last-child:after {
  456. content: ''
  457. }
  458. }
  459. }
  460. .lottery-share {
  461. margin: #{20rpx} 0;
  462. image {
  463. height: #{140rpx};
  464. margin: 0 auto;
  465. width: #{702rpx};
  466. display: block;
  467. }
  468. }
  469. .t1 {
  470. position: fixed;
  471. top: 0;
  472. left: 0;
  473. width: 100%;
  474. height: 100%;
  475. background: rgba(0, 0, 0, 0.25);
  476. }
  477. .goods-head-box {
  478. position: relative;
  479. }
  480. .time {
  481. position: absolute;
  482. bottom: #{120rpx};
  483. width: 100%;
  484. .time-info {
  485. height: #{56rpx};
  486. background: #ff4544;
  487. opacity: 0.6;
  488. padding: 0 #{24rpx};
  489. border-radius: #{28rpx};
  490. font-size: #{28rpx};
  491. color: #FFFFFF;
  492. .icon {
  493. height: #{24rpx};
  494. width: #{24rpx};
  495. background-repeat: no-repeat;
  496. background-size: 100% 100%;
  497. background-image: url('./../image/lottery-white.png');
  498. }
  499. view {
  500. margin-left: #{24rpx};
  501. }
  502. }
  503. .time-error {
  504. background: #000000;
  505. }
  506. }
  507. .goods {
  508. background: #FFFFFF;
  509. padding: 20upx 20upx 20upx 20upx;
  510. width: 702upx;
  511. margin: 24upx 24upx 0 24upx;
  512. border-radius: 15upx 15upx 0 0;
  513. .name {
  514. color: #353535;
  515. font-size: 32upx;
  516. line-height: 42upx;
  517. }
  518. .goods-subtitle {
  519. margin-top: 25upx;
  520. font-size: 24rpx;
  521. line-height: 34upx;
  522. color: #999999;
  523. }
  524. .detail {
  525. margin-top: #{24rpx};
  526. .bold {
  527. font-weight: bold;
  528. font-size: #{36rpx};
  529. color: #ff4544;
  530. }
  531. .num {
  532. margin-right: #{16rpx};
  533. margin-left: #{12rpx};
  534. }
  535. .price {
  536. color: #ff4544;
  537. padding-top: #{32rpx};
  538. }
  539. .del {
  540. color: #999999;
  541. margin-left: #{12rpx};
  542. text-decoration: line-through;
  543. }
  544. }
  545. .share {
  546. height: #{48rpx};
  547. border-radius: #{40rpx} 0 0 #{40rpx};
  548. padding: 0 #{14rpx};
  549. width: #{103rpx};
  550. margin-right: #{-20rpx};
  551. margin-top: #{44rpx};
  552. .share-icon {
  553. width: #{22rpx};
  554. height: #{22rpx};
  555. }
  556. .share-text {
  557. font-size: #{22rpx};
  558. color: #ffffff;
  559. margin-left: #{10rpx};
  560. }
  561. }
  562. }
  563. .step {
  564. width: 702upx;
  565. margin: 24upx 24upx 0 24upx;
  566. padding: 20upx 20upx 0 20upx;
  567. background: #FFFFFF;
  568. border-radius: 15upx 15upx 0 0;
  569. view {
  570. font-size: #{32rpx};
  571. color: #353535;
  572. }
  573. .icon-right {
  574. background-repeat: no-repeat;
  575. background-size: 100% 100%;
  576. height: #{22rpx};
  577. width: #{12rpx};
  578. margin-left: #{16rpx};
  579. background-image: url("../../../static/image/icon/arrow-right.png");
  580. }
  581. }
  582. .step-info {
  583. padding: #{40rpx} 0;
  584. background: #FFFFFF;
  585. width: 702upx;
  586. margin: 0 24upx 24upx 24upx;
  587. border-radius: 0 0 15upx 15upx;
  588. .label {
  589. font-size: #{52rpx};
  590. font-weight: bold;
  591. color: #dddddd;
  592. margin-right: #{20rpx};
  593. }
  594. .value {
  595. color: #666666;
  596. }
  597. }
  598. .code {
  599. margin-top: #{20rpx};
  600. }
  601. .lucky-all {
  602. width: 702upx;
  603. overflow-y: hidden;
  604. padding: #{20rpx};
  605. background: #ffffff;
  606. color: #353535;
  607. margin: 24upx 24upx 0 24upx;
  608. border-radius: 15upx;
  609. .friend {
  610. margin-top: #{16rpx};
  611. font-size: #{24rpx};
  612. margin-bottom: #{24rpx};
  613. color: #999999;
  614. }
  615. .swiper {
  616. // #ifdef MP-ALIPAY
  617. height: #{92rpx};
  618. // #endif
  619. // #ifndef MP-ALIPAY
  620. height: #{184rpx};
  621. // #endif
  622. .lucky-code {
  623. height: #{88rpx};
  624. background: #fff5f5;
  625. padding: 0 #{24rpx};
  626. margin-bottom: #{8rpx};
  627. image {
  628. margin-right: #{32rpx};
  629. height: #{64rpx};
  630. width: #{64rpx};
  631. border-radius: 50%
  632. }
  633. .nickname {
  634. color: #353535;
  635. }
  636. .font-normal {
  637. color: #666666;
  638. }
  639. }
  640. }
  641. .swiper-one {
  642. // #ifndef MP-ALIPAY
  643. height: #{92rpx};
  644. // #endif
  645. }
  646. }
  647. .goods-rule {
  648. border-bottom: #{1px} solid #e2e2e2;
  649. color: #353535;
  650. background: #FFFFFF;
  651. font-size: #{32rpx};
  652. line-height: #{80rpx};
  653. padding-left: #{24rpx};
  654. width: 702upx;
  655. margin: 24upx 24upx 0 24upx;
  656. border-radius: 15upx 15upx 0 0;
  657. }
  658. .rule-info {
  659. width: 702upx;
  660. margin: 0 24upx 24upx 24upx;
  661. border-radius: 0 0 15upx 15upx;
  662. background: #FFFFFF;
  663. padding: 20upx;
  664. }
  665. .bd-bottom {
  666. width: 750upx;
  667. height: 110upx;
  668. padding: 20upx 24upx;
  669. }
  670. .bd-btn {
  671. border-radius: 35upx;
  672. text-align: center;
  673. line-height: 70upx;
  674. font-size: 28upx;
  675. width: 50%;
  676. }
  677. .bd-bottom-first {
  678. margin-right: 20upx;
  679. }
  680. .bd-color {
  681. color: #ffffff;
  682. }
  683. .bd-btn-end {
  684. background: #cdcdcd;
  685. }
  686. .animation-model {
  687. position: fixed;
  688. top: 0;
  689. left: 0;
  690. right: 0;
  691. bottom: 0;
  692. overflow: hidden;
  693. z-index: 1999;
  694. .boxbg {
  695. height: #{840rpx};
  696. width: 100%;
  697. z-index: 1001;
  698. }
  699. .detaill {
  700. width: 100%;
  701. position: absolute;
  702. top: 50% - #{157rpx};
  703. z-index: 1002;
  704. .ani_box {
  705. height: 0;
  706. width: 0;
  707. image {
  708. opacity: 1;
  709. height: 100%;
  710. width: 100%;
  711. z-index: 20;
  712. }
  713. }
  714. }
  715. .image {
  716. width: 100%;
  717. height: #{840rpx};
  718. position: absolute;
  719. top: #{140rpx};
  720. left: 0;
  721. }
  722. }
  723. .u-bottom-height {
  724. height: 100upx;
  725. }
  726. .u-bottom-fixed {
  727. position: fixed;
  728. bottom: 0;
  729. left: 0;
  730. width: 100%;
  731. z-index: 1602;
  732. background-color: #ffffff;
  733. }
  734. </style>