index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. <template>
  2. <view style="position: absolute;width: 100%;height: 100%;top: 0;left: 0;background-color: #fff;overflow: auto;">
  3. <app-layout :haveBackground="haveBackground">
  4. <view :class="[`user`,recharge ? `` : `recharge`,nextMember.money > 0 ? `` : `less`]">
  5. <view v-if="detail.rules != '' && level > 0" class="question" @click="toRules">
  6. <image load-lazy="true" src="./../image/question.png"></image>
  7. </view>
  8. <!-- 开通充值后的模块 -->
  9. <view class="user-info">
  10. <image load-lazy="true" class="avatar" :src="userInfo.options.avatar"></image>
  11. <view>{{userInfo.nickname}}</view>
  12. <view class="user-member-info">
  13. <view class="member-detail">
  14. <image class="level-icon" load-lazy="true" :src="member_pic_url"></image>
  15. <text v-if="level == 0">{{userInfo.identity.level_name}}</text>
  16. <text v-if="level > 0" class="t-omit member-level-name">{{detail.name}}</text>
  17. </view>
  18. <text v-if="level > 0" style="margin-left: 15rpx;" class="t-omit">会员剩余天数:{{userInfo.user_level_date.end_date}}天</text>
  19. <view class="progress" v-if="nextMember.money > 0">
  20. <view class="progress-line">
  21. <view :style="[{'width': prop + `%`}]" class="progress-active"></view>
  22. </view>
  23. <view v-if="nextList.length > 0">消费¥{{ list !== null ? list.consumption_money : "0" }}/¥{{ detail !== null ? nextMember.money : "0" }}</view>
  24. </view>
  25. </view>
  26. </view>
  27. <view :class="[`user-balance`,`main-between`,`cross-center`,nextMember.money > 0 ? `` : `less`]" v-if="recharge == true">
  28. <view class="user-text">
  29. <view>账户余额</view>
  30. <view class="user-price">¥{{balance}}</view>
  31. </view>
  32. <view class="to-recharge" @click="toRecharge">
  33. <button class="go-btn">去充值</button>
  34. </view>
  35. </view>
  36. <!-- 用户信息 -->
  37. <view :class="[`card`,recharge ? `` : `recharge`,nextMember.money > 0 ? `` : `less`]">
  38. <image load-lazy="true" class="card-img" :src="list.mall_member != null ? detail.bg_pic_url : list.member_bg_pic_url"></image>
  39. <image class="card-bottom" :src="memberImg.card_bottom"></image>
  40. </view>
  41. </view>
  42. <!-- 特权展示 -->
  43. <view class="member-info">
  44. <view v-if="level > 0 && detail.rights.length > 0" class="member-title main-center cross-center">
  45. <image load-lazy="true" :src="memberImg.member_left"></image>
  46. <view class="info-text">{{detail.name}}特权</view>
  47. <image load-lazy="true" :src="memberImg.member_right"></image>
  48. </view>
  49. <image v-else load-lazy="true" class="banner" :src="memberImg.banner"></image>
  50. <view @click="toDetail" v-if="detail.rights.length > 0">
  51. <view :class="[`main-center flex-wrap`, `rights`, `${level == 0 ? 'border' : ''}`]">
  52. <view class="rights-item" v-for="item in detail.rights" :key="item.id">
  53. <image load-lazy="true" class="rights-img" :src="item.pic_url"></image>
  54. <view class="t-omit">{{item.title}}</view>
  55. </view>
  56. </view>
  57. </view>
  58. </view>
  59. <!-- 升级会员 -->
  60. <view class="update" v-if="nextList.length > 0">
  61. <view class="update-nav">
  62. <image load-lazy="true" class="update-img" :src="memberImg.up"></image>
  63. <view @click="toMore">
  64. <view class="more">
  65. <text>更多</text>
  66. <image load-lazy="true" src="/static/image/icon/arrow-right.png"></image>
  67. </view>
  68. </view>
  69. </view>
  70. <!-- 可升级的会员大于一个 -->
  71. <view class="member-list main-center" v-if="nextList.length > 1">
  72. <view class="member-item" v-for="item in nextList" :key="item.id">
  73. <image load-lazy="true" class="memeber-img" :src="item.bg_pic_url ? item.bg_pic_url : item.pic_url"></image>
  74. <view class="memeber-other">
  75. <view class="member-name t-omit">{{item.name}}</view>
  76. <!-- <view class="discount">
  77. <text>{{item.discount}}</text>折
  78. </view>
  79. <view>会员折扣</view> -->
  80. <view @click="toMore(item.level)">
  81. <button class="update-btn">{{item.level == userInfo.identity.member_level?'立即续费':'立即升级' }}</button>
  82. </view>
  83. </view>
  84. </view>
  85. </view>
  86. <!-- 可升级的会员只有一个 -->
  87. <view class="level" v-else>
  88. <image load-lazy="true" class="level-img" :src="nextList[0].bg_pic_url ? nextList[0].bg_pic_url : nextList[0].pic_url "></image>
  89. <view class="level-right">
  90. <view class="level-name t-omit">{{ nextList[0].name }}</view>
  91. <!-- 会员折扣
  92. <text class="discount">
  93. <text>{{nextList[0].discount}}</text>折
  94. </text> -->
  95. <view @click="toMore(nextList[0].level)">
  96. <button class="level-btn">{{nextList[0].level == userInfo.identity.member_level?'立即续费':'立即升级' }}</button>
  97. </view>
  98. </view>
  99. </view>
  100. </view>
  101. <!-- 优惠券 -->
  102. <view class="coupon" v-if="coupon.length > 0">
  103. <view class="update-nav">
  104. <image load-lazy="true" class="update-img" :src="memberImg.coupon"></image>
  105. </view>
  106. <scroll-view class="coupon-list" scroll-x>
  107. <view v-for="(item,index) in coupon" :key="item.id" @click="toCoupon(item.id)" class="coupon-item">
  108. <image load-lazy="true" v-if="item.user_count === '0'" class="coupon-bg" :src="memberImg.coupon_index"></image>
  109. <image load-lazy="true" v-else class="coupon-bg" :src="memberImg.coupon_received"></image>
  110. <view class="coupon-price" v-if="item.type == 2">¥
  111. <text>{{item.sub_price}}</text>
  112. </view>
  113. <view class="coupon-price" v-else>
  114. <text>{{item.discount}}</text>折
  115. </view>
  116. <view class="coupon-total">满{{item.min_price}}可用</view>
  117. <view @click.stop="receive(item,index)" :style="{'padding-top': `${item.user_count === '0' ? '10rpx':'25rpx'}`}" class="coupon-status">{{item.user_count === '0' ?'立即领取' :'已领取'}}</view>
  118. </view>
  119. </scroll-view>
  120. </view>
  121. <!-- 商品 -->
  122. <view class="goods" v-if="goods.length > 0">
  123. <view class="update-nav">
  124. <image load-lazy="true" class="update-img" :src="memberImg.goods"></image>
  125. <view @click="toGoods">
  126. <view class="more">
  127. <text>更多</text>
  128. <image load-lazy="true" src="/static/image/icon/arrow-right.png"></image>
  129. </view>
  130. </view>
  131. </view>
  132. <scroll-view class="goods-list" scroll-x>
  133. <view v-for="item in goods" :key="item.id" @click="toGoods(item.id)" class="goods-item">
  134. <image load-lazy="true" class="goods-img" :src="item.cover_pic"></image>
  135. <view class="goods-name t-omit">{{item.name}}</view>
  136. <view class="goods-price">¥
  137. <text>{{item.price}}</text>
  138. </view>
  139. <view class="before">原价{{item.original_price}}元</view>
  140. </view>
  141. </scroll-view>
  142. </view>
  143. <view v-if="tabbarbool" class="placeholder"></view>
  144. </app-layout>
  145. </view>
  146. </template>
  147. <script>
  148. import { mapState } from "vuex";
  149. export default {
  150. data() {
  151. return {
  152. currentRoute: this.$platDiff.route(),
  153. tabbarbool: false,
  154. detail: {
  155. rules: ''
  156. },
  157. list: null,
  158. nextList: null,
  159. goods: [],
  160. first: false,
  161. haveBackground: false,
  162. coupon: [],
  163. balance: 0,
  164. loading: false,
  165. member_pic_url: null,
  166. nextMember: {},
  167. recharge: false,
  168. current: 'wechat',
  169. prop: 0,
  170. page_loading: true,
  171. level: 0
  172. }
  173. },
  174. name: "index",
  175. computed: {
  176. ...mapState({
  177. tabBarNavs: state => state.mallConfig.navbar.navs,
  178. userInfo: state => state.user.info,
  179. memberImg: state => state.mallConfig.__wxapp_img.member,
  180. couponImg: state => state.mallConfig.__wxapp_img.coupon,
  181. })
  182. },
  183. watch: {
  184. tabBarNavs: {
  185. handler: function() {
  186. this.b();
  187. },
  188. immediate: true,
  189. }
  190. },
  191. methods: {
  192. b() {
  193. let currentRoute = this.currentRoute;
  194. for (let i = 0; i < this.tabBarNavs.length; i++) {
  195. if(currentRoute.includes(this.tabBarNavs[i].url.split('?')[0])) {
  196. return this.tabbarbool = true;
  197. }
  198. }
  199. return this.tabbarbool = false;
  200. },
  201. receive(item,index) {
  202. let that = this;
  203. if(item.user_count > 0 || that.loading) {
  204. return false
  205. }
  206. that.loading = true;
  207. uni.showLoading({
  208. title: '领取中...'
  209. });
  210. that.$request({
  211. url: that.$api.member.receive,
  212. data: {
  213. coupon_id: item.id
  214. },
  215. }).then(response=>{
  216. that.loading = false;
  217. uni.hideLoading();
  218. if(response.code === 0) {
  219. uni.showToast({
  220. title: response.msg,
  221. duration: 1000
  222. });
  223. that.coupon[index].user_count = response.data.rest === 0 ? 1 : 0;
  224. }else {
  225. uni.showToast({
  226. title: response.msg,
  227. icon: 'none',
  228. duration: 1000
  229. });
  230. }
  231. }).catch(() => {
  232. uni.hideLoading();
  233. that.$event.on(that.$const.EVENT_USER_LOGIN).then(()=>{
  234. that.receive(item,index);
  235. });
  236. });
  237. },
  238. toCoupon(id) {
  239. uni.navigateTo({
  240. url: '/pages/coupon/details/details-no-share?is_member=1&id='+ id
  241. });
  242. },
  243. toGoods(id) {
  244. if(id) {
  245. uni.navigateTo({
  246. url: '/pages/goods/goods?id=' + id
  247. })
  248. }else {
  249. uni.navigateTo({
  250. url: '/pages/member/goods/goods?discount=' + this.detail.discount
  251. })
  252. }
  253. },
  254. toDetail() {
  255. uni.navigateTo({
  256. url: '/pages/member/detail/detail?level='+ this.level + '&prop=' + this.prop
  257. });
  258. },
  259. toMore(level) {
  260. if(level > 0) {
  261. uni.navigateTo({
  262. url: '/pages/member/upgrade/upgrade?level=' + this.level + '&other=' + level
  263. })
  264. }else {
  265. uni.navigateTo({
  266. url: '/pages/member/upgrade/upgrade?level=' + this.level
  267. })
  268. }
  269. },
  270. toRules() {
  271. uni.navigateTo({
  272. url: `/pages/rules/index?url=${encodeURIComponent(this.$api.member.index)}&keys=${JSON.stringify(['mall_member', 'rules'])}`,
  273. });
  274. },
  275. toRecharge() {
  276. uni.navigateTo({
  277. url: '/pages/balance/recharge'
  278. });
  279. },
  280. getList() {
  281. let that = this;
  282. that.$request({
  283. url: that.$api.member.index,
  284. method: 'get',
  285. }).then(response=>{
  286. that.$hideLoading();
  287. that.$store.dispatch('user/info');
  288. if(response.code == 0) {
  289. that.list = response.data;
  290. that.detail = that.list.mall_member;
  291. that.goods = that.list.member_goods;
  292. that.coupon = that.list.member_coupons;
  293. that.nextMember = that.list.next_consume_upgrade_member;
  294. that.member_pic_url = that.list.member_pic_url;
  295. that.nextList = that.list.next_mall_member;
  296. console.log(this.nextList,"===============")
  297. if (that.recharge) {
  298. that.balance = that.list.user_info.balance
  299. }
  300. if (that.detail != null) {
  301. that.level = that.detail.level;
  302. }
  303. if (that.nextMember) {
  304. that.prop = that.list.consumption_money / that.nextMember.money * 100;
  305. if(that.prop > 100) {
  306. that.prop = 100;
  307. }
  308. }
  309. if (that.detail == null && that.nextList.length > 0) {
  310. that.detail = that.nextList[0]
  311. }
  312. }else {
  313. uni.showToast({
  314. title: response.msg,
  315. icon: 'none',
  316. duration: 1000
  317. });
  318. }
  319. }).catch(response => {
  320. that.$hideLoading();
  321. that.$event.on(that.$const.EVENT_USER_LOGIN).then(()=>{
  322. that.getList();
  323. });
  324. });
  325. },
  326. },
  327. onLoad() {
  328. let that = this;
  329. that.$showLoading({
  330. type: 'global',
  331. text: '加载中...'
  332. });
  333. that.$request({
  334. url: that.$api.recharge.setting,
  335. method: 'get',
  336. }).then(response=>{
  337. if(response.code == 0) {
  338. if (response.data.setting.status == 1) {
  339. that.recharge = true
  340. }
  341. }else {
  342. uni.showToast({
  343. title: response.msg,
  344. icon: 'none',
  345. duration: 1000
  346. });
  347. }
  348. }).catch(response => {
  349. that.$hideLoading();
  350. });
  351. },
  352. onShow() {
  353. let that = this;
  354. that.getList();
  355. }
  356. }
  357. </script>
  358. <style scoped lang="scss">
  359. .placeholder {
  360. height: #{160rpx};
  361. background-color: #fff;
  362. }
  363. .member-level-name {
  364. max-width: #{200rpx};
  365. }
  366. .info-text {
  367. margin: 0 #{20rpx};
  368. }
  369. .user {
  370. position: relative;
  371. height: #{690rpx};
  372. width: 100%;
  373. background-color: #fff;
  374. overflow: hidden;
  375. &.recharge {
  376. height: #{550rpx};
  377. &.less {
  378. height: #{480rpx};
  379. }
  380. }
  381. }
  382. .user-info {
  383. position: absolute;
  384. left: 0;
  385. right: 0;
  386. top: #{40rpx};
  387. width: 100%;
  388. padding: 0 #{45rpx};
  389. z-index: 5;
  390. color: #fff;
  391. padding-left: #{185rpx};
  392. .user-member-info {
  393. margin-top: #{16rpx};
  394. font-size: #{20rpx};
  395. display: flex;
  396. align-items: center;
  397. }
  398. .avatar {
  399. height: #{100rpx};
  400. width: #{100rpx};
  401. border-radius: 50%;
  402. border: #{2rpx} solid #fff;
  403. position: absolute;
  404. left: #{45rpx};
  405. }
  406. }
  407. .member-detail {
  408. position: relative;
  409. height: #{36rpx};
  410. line-height: #{36rpx};
  411. border-radius: #{18rpx};
  412. padding: 0 #{16rpx} 0 #{54rpx};
  413. background-color: #454955;
  414. display: inline-block;
  415. // margin-bottom: #{15rpx};
  416. }
  417. .member-detail .level-icon{
  418. border-radius: 50%;
  419. position: absolute;
  420. margin-bottom: #{-3rpx};
  421. }
  422. .member-detail image {
  423. height: #{44rpx};
  424. width: #{44rpx};
  425. position: absolute;
  426. bottom: 0;
  427. left: 0;
  428. }
  429. .card {
  430. height: #{690rpx};
  431. width: 100%;
  432. position: relative;
  433. background-color: #292a31;
  434. z-index: 2;
  435. &.less {
  436. height: #{650rpx};
  437. &.recharge {
  438. height: #{480rpx};
  439. }
  440. }
  441. &.recharge {
  442. height: #{530rpx};
  443. }
  444. }
  445. .card-bottom {
  446. position: absolute;
  447. width: 100%;
  448. height: #{80rpx};
  449. bottom: 0;
  450. left: 0;
  451. z-index: 5;
  452. }
  453. .question {
  454. position: absolute;
  455. right: #{24rpx};
  456. top: #{24rpx};
  457. z-index: 99;
  458. }
  459. .question image {
  460. height: #{36rpx};
  461. width: #{36rpx};
  462. }
  463. .card-img {
  464. position: absolute;
  465. bottom: 0;
  466. left: 0;
  467. right: 0;
  468. height: #{320rpx};
  469. width: #{660rpx};
  470. margin: 0 auto;
  471. border-radius: #{16rpx};
  472. z-index: 3;
  473. }
  474. .member-info {
  475. background-color: #fff;
  476. padding-top: #{40rpx};
  477. }
  478. .member-title image {
  479. height: #{32rpx};
  480. width: #{68rpx};
  481. }
  482. .user-balance {
  483. height: #{140rpx};
  484. width: #{660rpx};
  485. background-color: #454955;
  486. position: absolute;
  487. top: #{210rpx};
  488. left: #{45rpx};
  489. right: #{45rpx};
  490. border-radius: #{16rpx};
  491. z-index: 999;
  492. padding: #{36rpx};
  493. color: #fff;
  494. &.less {
  495. top: #{160rpx};
  496. }
  497. }
  498. .user-text {
  499. vertical-align: top;
  500. font-size: #{18rpx};
  501. display: inline-block;
  502. }
  503. .user-price {
  504. font-size: #{46rpx};
  505. font-family: DIN;
  506. }
  507. .go-btn {
  508. background-color: #454955;
  509. height: #{56rpx};
  510. line-height: #{52rpx};
  511. width: #{140rpx};
  512. border-radius: #{28rpx};
  513. font-size: #{28rpx};
  514. color: #fff;
  515. border: #{1rpx} solid #fff;
  516. padding: 0;
  517. text-align: center;
  518. margin-top: #{1rpx};
  519. }
  520. .go-btn::after {
  521. border: 0;
  522. }
  523. .progress-line {
  524. height: #{10rpx};
  525. border-radius: #{5rpx};
  526. margin-bottom: #{5rpx};
  527. background-color: #949598;
  528. position: relative;
  529. }
  530. .progress-active {
  531. height: #{10rpx};
  532. border-radius: #{5rpx};
  533. background-color: #FFB82F;
  534. position: absolute;
  535. left: 0;
  536. top: 0;
  537. }
  538. .card-info {
  539. position: absolute;
  540. bottom: #{-10rpx};
  541. left: #{620rpx};
  542. height: #{320rpx};
  543. width: #{660rpx};
  544. padding: #{78rpx} #{100rpx} 0;
  545. color: rgba(53, 53, 53, 0.7);
  546. font-size: #{24rpx};
  547. text-align: center;
  548. }
  549. .card-name {
  550. font-size: #{44rpx};
  551. color: #fff;
  552. }
  553. .rights {
  554. margin-top: #{40rpx};
  555. text-align: center;
  556. color: #353535;
  557. font-size: #{26rpx};
  558. white-space: nowrap;
  559. width: auto;
  560. }
  561. .rights-item {
  562. display: inline-block;
  563. width: #{150rpx};
  564. margin: 0 #{40rpx} #{20rpx};
  565. }
  566. .rights-item .t-omit {
  567. display: block;
  568. }
  569. .rights-img {
  570. height: #{80rpx};
  571. width: #{80rpx};
  572. margin-bottom: #{12rpx};
  573. }
  574. .update {
  575. background-color: #fff;
  576. padding-top: #{60rpx};
  577. padding-bottom: #{40rpx};
  578. }
  579. .update-nav {
  580. height: #{64rpx};
  581. padding: 0 #{26rpx};
  582. color: #999;
  583. font-size: #{28rpx};
  584. }
  585. .update-img {
  586. float: left;
  587. height: #{64rpx};
  588. width: #{200rpx};
  589. }
  590. .more {
  591. height: #{64rpx};
  592. line-height: #{64rpx};
  593. float: right;
  594. }
  595. .more image {
  596. height: #{22rpx};
  597. width: #{12rpx};
  598. margin-left: #{12rpx};
  599. }
  600. .member-list {
  601. margin-top: #{32rpx};
  602. height: #{505rpx};
  603. white-space: nowrap;
  604. width: auto;
  605. }
  606. .member-item {
  607. margin: #{20rpx};
  608. width: #{342rpx};
  609. height: #{465rpx};
  610. display: inline-block;
  611. position: relative;
  612. text-align: center;
  613. font-size: #{24rpx};
  614. color: #999;
  615. box-shadow: #{0rpx} #{0rpx} #{20rpx} rgba(0, 0, 0, 0.1);
  616. border-radius: #{16rpx};
  617. }
  618. .memeber-other {
  619. padding-top: #{22rpx};
  620. height: #{290rpx};
  621. width: 100%;
  622. border: #{1rpx} solid #e2e2e2;
  623. border-top: 0;
  624. border-bottom-left-radius: #{16rpx};
  625. border-bottom-right-radius: #{16rpx};
  626. display: flex;
  627. justify-content: center;
  628. flex-direction: column;
  629. }
  630. .memeber-img {
  631. width: 100%;
  632. height: #{175rpx};
  633. display: block;
  634. border-top-left-radius: #{16rpx};
  635. border-top-right-radius: #{16rpx};
  636. }
  637. .member-name {
  638. color: #353535;
  639. font-size: #{32rpx};
  640. width: 100%;
  641. text-align: center;
  642. }
  643. .member-price {
  644. margin-top: #{8rpx};
  645. font-size: #{24rpx};
  646. color: rgba(53, 53, 53, 0.7);
  647. }
  648. .member-price text {
  649. font-size: #{42rpx};
  650. }
  651. .discount {
  652. padding-top: #{12rpx};
  653. color: #ffb82f;
  654. font-size: #{24rpx};
  655. }
  656. .discount text {
  657. font-size: #{40rpx};
  658. }
  659. .update-btn {
  660. height: #{62rpx};
  661. width: 60%;
  662. line-height: #{60rpx};
  663. margin: #{24rpx} auto 0;
  664. font-size: #{28rpx};
  665. color: #b4914f;
  666. border-radius: #{31rpx};
  667. background-color: #fff;
  668. border: #{1rpx} solid #b4914f;
  669. }
  670. .update-btn::after {
  671. border: 0;
  672. }
  673. .coupon {
  674. padding-bottom: #{40rpx};
  675. background-color: #fff;
  676. }
  677. .coupon-list {
  678. margin-top: #{32rpx};
  679. padding-left: #{26rpx};
  680. height: #{130rpx};
  681. white-space: nowrap;
  682. overflow: hidden;
  683. width: auto;
  684. }
  685. .coupon-item {
  686. height: #{130rpx};
  687. width: #{260rpx};
  688. position: relative;
  689. font-size: #{24rpx};
  690. margin-right: #{15rpx};
  691. display: inline-block;
  692. }
  693. .coupon-bg {
  694. height: #{130rpx};
  695. width: #{260rpx};
  696. }
  697. .coupon-price {
  698. position: absolute;
  699. top: #{15rpx};
  700. left: 0;
  701. right: 0;
  702. color: #fff;
  703. text-align: center;
  704. width: 75%;
  705. }
  706. .coupon-price text {
  707. font-size: #{40rpx};
  708. }
  709. .coupon-total {
  710. position: absolute;
  711. bottom: #{10rpx};
  712. left: 0;
  713. right: 0;
  714. color: #fff;
  715. text-align: center;
  716. width: 75%;
  717. }
  718. .coupon-status {
  719. position: absolute;
  720. top: 0;
  721. right: 0;
  722. width: #{70rpx};
  723. height: #{130rpx};
  724. font-size: #{22rpx};
  725. color: #fff;
  726. white-space: normal;
  727. line-height: 125%;
  728. padding: #{10rpx} 0 0 #{30rpx};
  729. }
  730. .goods {
  731. margin-bottom: #{55rpx};
  732. }
  733. .goods-list {
  734. margin-top: #{32rpx};
  735. height: #{440rpx};
  736. white-space: nowrap;
  737. }
  738. .goods-item {
  739. margin: #{20rpx} 0;
  740. height: #{400rpx};
  741. width: #{220rpx};
  742. display: inline-block;
  743. margin-left: #{20rpx};
  744. padding: #{24rpx};
  745. color: #999;
  746. font-size: #{24rpx};
  747. text-align: center;
  748. border-radius: #{8rpx};
  749. box-shadow: 0 0 #{20rpx} rgba(0, 0, 0, 0.1);
  750. }
  751. .goods-img {
  752. height: #{210rpx};
  753. width: #{210rpx};
  754. margin-bottom: #{10rpx};
  755. display: block;
  756. }
  757. .goods-name {
  758. color: #666;
  759. width: #{210rpx};
  760. }
  761. .goods-price {
  762. color: #b4914f;
  763. margin: #{5rpx};
  764. }
  765. .goods-price text {
  766. font-size: #{42rpx};
  767. }
  768. .before {
  769. text-decoration: line-through;
  770. }
  771. .level {
  772. margin: #{32rpx} auto #{40rpx};
  773. width: #{700rpx};
  774. height: #{206rpx};
  775. border-radius: #{16rpx};
  776. border: #{1rpx} solid #e2e2e2;
  777. position: relative;
  778. box-shadow: 0 0 #{20rpx} rgba(0, 0, 0, 0.1);
  779. }
  780. .level-img {
  781. height: 100%;
  782. width: #{400rpx};
  783. float: left;
  784. display: block;
  785. border-top-left-radius: #{16rpx};
  786. border-bottom-left-radius: #{16rpx};
  787. }
  788. .level-name {
  789. font-size: #{32rpx};
  790. color: #353535;
  791. width: 100%;
  792. height: #{40rpx};
  793. }
  794. .level-right {
  795. position: absolute;
  796. right: 0;
  797. top: 0;
  798. width: #{300rpx};
  799. height: #{206rpx};
  800. color: #999;
  801. font-size: #{24rpx};
  802. text-align: center;
  803. padding: #{20rpx} 0;
  804. border-top-right-radius: #{16rpx};
  805. border-bottom-right-radius: #{16rpx};
  806. display: flex;
  807. flex-direction: column;
  808. align-items: center;
  809. justify-content: center;
  810. }
  811. .level-right .discount {
  812. margin-left: #{14rpx};
  813. margin-top: #{-5rpx};
  814. }
  815. .level-btn {
  816. margin-top: #{14rpx};
  817. height: #{48rpx};
  818. line-height: #{46rpx};
  819. padding: 0 #{30rpx};
  820. border-radius: #{24rpx};
  821. border: #{1rpx} solid #b4914f;
  822. font-size: #{24rpx};
  823. display: inline-block;
  824. color: #b4914f;
  825. background-color: #fff;
  826. }
  827. .level-btn::after {
  828. border: 0;
  829. }
  830. .banner {
  831. width: 100%;
  832. height: #{110rpx};
  833. display: block;
  834. margin: #{40rpx} 0 #{20rpx};
  835. }
  836. .no-rights {
  837. height: #{200rpx};
  838. width: #{700rpx};
  839. margin: 0 auto;
  840. border: #{1rpx} solid #b4914f;
  841. border-radius: #{16rpx};
  842. text-align: center;
  843. color: #353535;
  844. font-size: #{26rpx};
  845. padding-top: #{35rpx};
  846. }
  847. .rights.border {
  848. border: #{1rpx} solid #b4914f;
  849. margin: 0 #{26rpx};
  850. width: auto;
  851. min-height: #{200rpx};
  852. border-radius: #{16rpx};
  853. }
  854. .border .rights-item {
  855. margin-top: #{34rpx};
  856. }
  857. .no-next {
  858. padding-top: #{140rpx};
  859. }
  860. </style>