2021年6月10日 团队冲刺第二阶段07

今天写了支付的界面,完成了逻辑上的代码,但是调不了接口有点难度,经过我们商量之后,这个小小的功能暂时放弃,用户支付完成后还可以自动生成取票码,明天继续。

<template>
    <div id="pay">
      <div class="top">
        <span class="icon-back" @click="back"></span>
        <span class="name ellipsis">支付订单</span>
      </div>
      <div class="order-info">
        <div class="time-down">
          <div class="title">支付剩余时间</div>
          <div class="time">
            <div class="minute"><span>{{countdown_m_b}}</span><span>{{countdown_m_s}}</span></div>
            <p>:</p>
            <div class="second"><span>{{countdown_s_b}}</span><span>{{countdown_s_s}}</span></div>
          </div>
        </div>
        <div class="order-num">
          <span class="left icon-shop"></span>
          <div class="right">
            <div class="total">¥{{Number(this.$cookies.get('total_price')).toFixed(2)}}</div>
            <div class="num">订单编号:{{this.$cookies.get('order_num')}}</div>
          </div>
        </div>
      </div>
      <div class="pay-type">
        <div class="wechat type"><span class="icon icon-wechat"></span><p>微信支付</p><span :class="[{'icon-circle-selected-fill':selectPayType},{'icon-circle-unselect':!selectPayType}]" @click="selectPayType?selectPayType:selectPayType=!selectPayType"></span></div>
        <div class="alipay type"><span class="icon icon-alipay"></span><p>支付宝</p><span :class="[{'icon-circle-selected-fill':!selectPayType},{'icon-circle-unselect':selectPayType}]" @click="!selectPayType?selectPayType:selectPayType=!selectPayType"></span></div>
      </div>
      <div class="bottom">
        <div class="pay-btn" @click="handlePay">确认支付</div>
      </div>
    </div>
</template>

<script>
    import {order,getScheduleById,updateScheduleSeat} from '../../api/index'
    import {Indicator,MessageBox,Toast} from 'mint-ui'
    export default {
        name: "Pay",
        data(){
          return{
            scheduleInfo:{},
            seatInfo:[],
            countdown_m_b:'',
            countdown_m_s:'',
            countdown_s_b:'',
            countdown_s_s:'',
            selectPayType:true,//微信
            timer:'',
          }
        },
        created(){
          Indicator.open('Loading...');
          this.loadInfo();
          if (this.$cookies.get('countdown_m')&&this.$cookies.get('countdown_m')){
            if (!this.$cookies.get('countdown_m')[1]) {
              this.countdown_m_s = Number(this.$cookies.get('countdown_m')[0]);
              this.countdown_m_b = 0;
            }
            if (!this.$cookies.get('countdown_s')[1]) {
              this.countdown_s_s = Number(this.$cookies.get('countdown_s')[0]);
              this.countdown_s_b = 0;
            }
            this.countdown_m_s = Number(this.$cookies.get('countdown_m')[1]);
            this.countdown_m_b = Number(this.$cookies.get('countdown_m')[0]);
            this.countdown_s_s = Number(this.$cookies.get('countdown_s')[1]);
            this.countdown_s_b = Number(this.$cookies.get('countdown_s')[0]);
          }
          this.timer = setInterval(()=>{
              if (this.countdown_s_s!==0){
                this.countdown_s_s-=1;
              } else{
                if (this.countdown_s_b!==0){
                  this.countdown_s_b -=1;
                  this.countdown_s_s-=1;
                  this.countdown_s_s = 9;
                } else{
                  if (this.countdown_m_s!==0){
                    this.countdown_m_s-=1;
                    this.countdown_s_b=5;
                    this.countdown_s_s-=1;
                    this.countdown_s_s = 9;
                  } else{
                    if (this.countdown_m_b!==0) {
                      this.countdown_m_b-=1;
                      this.countdown_m_s=1;
                      this.countdown_s_b=5;
                      this.countdown_s_s-=1;
                      this.countdown_s_s = 9;
                    } else{
                      clearInterval(this.timer);
                      this.back();
                    }
                  }
                }
              }
          },1000);
        },
        methods:{
          async loadInfo(){
            let json = await getScheduleById(this.$route.query.schedule_id);
            if (json.success_code===200){
              this.scheduleInfo = json.data;
              this.seatInfo = this.scheduleInfo.seat_info;
              this.seatInfo = JSON.parse(this.seatInfo);
            }
            Indicator.close();
          },
          async back(){
            this.$cookies.remove('countdown_m');
            this.$cookies.remove('countdown_s');
            this.$cookies.remove('order_num');
            this.$cookies.remove('total_price');
              let currentIndex;
              if (this.$cookies.get('seat_1')) {
                this.seatInfo.forEach((value,index)=>{
                  if (Number(this.$cookies.get('seat_1'))===value){
                    currentIndex = index;
                  }
                });
                this.seatInfo.splice(currentIndex,1);
              }
              if (this.$cookies.get('seat_2')) {
                this.seatInfo.forEach((value,index)=>{
                  if (Number(this.$cookies.get('seat_2'))===value){
                    currentIndex = index;
                  }
                });
                this.seatInfo.splice(currentIndex,1);
              }
              if (this.$cookies.get('seat_3')) {
                this.seatInfo.forEach((value,index)=>{
                  if (Number(this.$cookies.get('seat_3'))===value){
                    currentIndex = index;
                  }
                });
                this.seatInfo.splice(currentIndex,1);
              }
              if (this.$cookies.get('seat_4')) {
                this.seatInfo.forEach((value,index)=>{
                  if (Number(this.$cookies.get('seat_4'))===value){
                    currentIndex = index;
                  }
                });
                this.seatInfo.splice(currentIndex,1);
              }
              let json = await updateScheduleSeat(this.$route.query.schedule_id,JSON.stringify(this.seatInfo));
              if (json.success_code===200){
                this.$cookies.remove('seat_1');
                this.$cookies.remove('seat_2');
                this.$cookies.remove('seat_3');
                this.$cookies.remove('seat_4');
                this.$cookies.remove('seat_count');
                this.$cookies.remove('order_phone');
                clearInterval(this.timer);
                Toast({
                  message: '解除座位锁定成功',
                  position: 'middle',
                  duration: 2000
                });
                this.$router.go(-2);
              }
          },
          async handlePay(){
            let info;
            if (this.selectPayType){
              info = '您的微信将支付¥'+(Number(this.$cookies.get('total_price')).toFixed(2))+'元';
            } else{
              info = '您的支付宝将支付¥'+(Number(this.$cookies.get('total_price')).toFixed(2))+'元';
            }
            MessageBox.confirm(info,'支付提示').then(async action =>{
              if (action==='confirm'){
                  let seatArr = [];
                  if (this.$cookies.get('seat_1')) {
                    seatArr.push(Number(this.$cookies.get('seat_1')));
                  }
                  if (this.$cookies.get('seat_2')) {
                    seatArr.push(Number(this.$cookies.get('seat_2')));
                  }
                  if (this.$cookies.get('seat_3')) {
                    seatArr.push(Number(this.$cookies.get('seat_3')));
                  }
                  if (this.$cookies.get('seat_4')) {
                    seatArr.push(Number(this.$cookies.get('seat_4')));
                  }
                  let json = await order(
                    this.$cookies.get('user_id'),
                    this.$route.query.schedule_id,
                    this.$cookies.get('order_phone'),
                    new Date().getFullYear()+'-'+(Number(new Date().getMonth())+1)+'-'+new Date().getDate(),
                    seatArr.length,
                    this.$cookies.get('total_price'),
                    JSON.stringify(seatArr),
                    (this.selectPayType?0:1)
                  );
                  if (json.success_code===200){
                    MessageBox.alert('您的取票码为:'+json.data.phone_code,'支付成功');
                  }
                  this.$cookies.remove('seat_1');
                  this.$cookies.remove('seat_2');
                  this.$cookies.remove('seat_3');
                  this.$cookies.remove('seat_4');
                  this.$cookies.remove('seat_count');
                  this.$cookies.remove('order_phone');
                  this.$cookies.remove('countdown_m');
                  this.$cookies.remove('countdown_s');
                  this.$cookies.remove('order_num');
                  this.$cookies.remove('total_price');
                  clearInterval(this.timer);
                  this.$router.push('/home');
              }
            });
          }
        }
    }
</script>

<style scoped lang="stylus" ref="stylesheet/stylus">
  #pay
    width 100%
    height 100%
    color #000
    font-size .3125rem
    .top
      width 100%
      height 1rem
      display flex
      justify-content center
      align-items center
      position fixed
      top 0
      left 0
      background-color #dd2727
      color #fff
      .icon-back
        font-size .4rem
        position absolute
        left .3rem
      .name
        width 60%
        font-size .345rem
        text-align center
    .order-info
      margin-top 1rem
      height 3rem
      border-bottom .04rem dashed #f1f1f1
      .time-down
        display flex
        justify-content center
        align-items center
        flex-flow column
        padding-bottom .25rem
        border-bottom .04rem dashed #ccc
        margin 0 .25rem
        .title
          padding .2rem 0
          font-size .28rem
        .time
          display flex
          justify-content center
          align-items center
          span
            font-size .25rem
            display inline-block
            text-align center
            line-height .36rem
            width .36rem
            height .36rem
            background-color: #333
            color #fff
            &:first-child
              margin-right .12rem
          p
            padding 0 .12rem
      .order-num
        display flex
        justify-content center
        align-items center
        padding-top .4rem
        position relative
        .left
          font-size 1rem
          position absolute
          left .8rem
          top .4rem
        .right
          position absolute
          left 2.2rem
          top .4rem
          display flex
          flex-flow column
          .total
            font-size .46rem
            margin-bottom .21rem
          .num
            font-size .28rem
            letter-spacing .02rem
    .pay-type
      border-top .2rem solid #f1f1f1
      position fixed
      width 100%
      left 0
      top 4rem
      bottom 0
      background-color #f1f1f1
      .type
        padding .25rem .3rem
        display flex
        justify-content space-between
        align-items center
        position relative
        border-bottom .04rem solid #f1f1f1
        background-color #fff
        span
          font-size .6rem
        p
          position absolute
          left 1.2rem
    .bottom
      border-top .02rem solid #f1f1f1
      position fixed
      width 100%
      left 0
      bottom 0
      display flex
      justify-content center
      align-items center
      flex-flow column
      padding .25rem
      box-sizing border-box
      z-index 999
      .pay-btn
        width 100%
        background-color #fe9900
        color #fff
        height .8rem
        display flex
        justify-content center
        align-items center
        border-radius .12rem
        font-size .28rem
</style>
<template>
    <div id="select-cinema">
      <div class="top">
        <span class="icon-back" @click="$router.go(-1)"></span>
        <span class="name ellipsis">{{movieInfo.name}}</span>
      </div>
      <ly-tab
        v-model="selectedId"
        :items="items"
        :options="options"
        class="ly-tab"
        v-if="hackReset"
        @change="changeLyTabItem"
      />
      <div class="content">
        <div class="item" v-for="(item,index) in dateCinemaSchedule" :key="index" @click="$router.push({path:'/cinema_detail',query:{movie_id:$route.query.movie_id,cinema_id:item.cinema_id}})">
          <div class="left">
            <div class="name ellipsis">{{item.cinema_name}}</div>
            <div class="address ellipsis">{{item.specified_address}}</div>
            <div class="label-block"><span>小吃</span><span>4D厅</span><span>杜比全景声厅</span><span>巨幕厅</span></div>
          </div>
          <!--<div class="right">-->
            <!--<div class="price-block"><span class="price">23</span>元起</div>-->
          <!--</div>-->
        </div>
      </div>
    </div>
</template>

<script>
    import {getMovieDetail,getCurrentMovieSchedule} from '../../api/index'
    import {formatDate} from '../../common/util/util'
    import {Indicator} from 'mint-ui'
    import Vue from 'vue'
    import LyTab from 'ly-tab'
    Vue.use(LyTab);
    export default {
        name: "SelectCinema",
        data(){
          return{
            movieInfo:'',
            selectedId:0,
            hasCinemaInfo:[],
            cinemaScheduleInfo:[],
            dateCinemaSchedule:[],
            hackReset:true,
            items:[],
            options:{
              activeColor: '#dd2727',
            },
          }
        },
        created() {
          Indicator.open('Loading...');
          this.loadInfo();
        },
        methods:{
          async loadInfo(){
            let json =await getMovieDetail(this.$route.query.movie_id);
            if (json.success_code===200){
              this.movieInfo = json.data[0];
            }
            json = await getCurrentMovieSchedule(this.$route.query.movie_id);
            if (json.success_code===200){
              this.hasCinemaInfo = json.data.hasCinemaInfo;
              this.cinemaScheduleInfo = json.data.cinemaScheduleInfo;
              this.cinemaScheduleInfo.forEach((value)=>{
                this.removeRepeat(value, 'cinema_id');
              });
              this.hasCinemaInfo.forEach((value)=>{
                this.items.push({label:formatDate(new Date(value[0].show_date),true),date:value[0].show_date});
              });
              this.hackReset = false;
              this.$nextTick(() => {
                this.hackReset = true;
              });
              this.dateCinemaSchedule = this.cinemaScheduleInfo[0];
            }
            Indicator.close();
          },
          //切换日期
          changeLyTabItem(item){
            this.hasCinemaInfo.forEach((value,index)=>{
              if (value[0].show_date===item.date){
                this.dateCinemaSchedule = this.cinemaScheduleInfo[index];
              }
            });
          },
          //去除重复的影院
          removeRepeat(arr, key){
            for(let i = 0; i < arr.length; i++) {
              for(let j = i+1; j < arr.length; j++) {
                if(arr[i][key] === arr[j][key]){
                  arr.splice(j, 1); j = j-1;
                }
              }
            }
          }
        }
    }
</script>

<style scoped lang="stylus" ref="stylesheet/stylus">
  #select-cinema
    width 100%
    height 100%
    color #000
    font-size .3125rem
    .top
      width 100%
      height 1rem
      display flex
      justify-content center
      align-items center
      position fixed
      top 0
      left 0
      background-color #dd2727
      color #fff
      .icon-back
        font-size .4rem
        position absolute
        left .3rem
      .name
        width 60%
        font-size .375rem
        line-height .375rem
        text-align center
    .ly-tab
      position fixed
      top 1rem
      left 0
    .select
      position fixed
      left 0
      top 1.68rem
      width 100%
      height .8rem
      display flex
      justify-content space-around
      align-items center
      border-bottom .03rem solid #f1f1f1
      border-top .03rem solid #f1f1f1
      box-sizing border-box
      background-color #fff
      .option
        width 33.33%
        box-sizing border-box
        padding .1rem .6rem
        display flex
        justify-content center
        align-items flex-end
        font-size .28rem
        border-right .02rem solid #f1f1f1
        &:last-child
          border-right none
        .arrow
          margin-left .1rem
          padding-bottom .05rem
          &::after
            content ''
            width 0
            height 0
            overflow hidden
            font-size 0
            line-height 0
            border-width .1rem
            border-style solid
            border-color #888 transparent transparent transparent
    .content
      margin-top 2rem
      font-size .3125rem
      .item
        display flex
        justify-content center
        align-items center
        box-sizing border-box
        padding .25rem
        width 100%
        margin-bottom .25rem
        .left
          width 100%
          .name
            font-size .345rem
            line-height .36rem
            font-weight 700
            margin-bottom .25rem
          .address
            font-size .28rem
            height .3rem
            color #666
            margin-bottom .25rem
          .label-block
            display flex
            span
              padding .06rem
              font-size .1rem
              border .01rem solid #f90
              margin-right .1rem
              border-radius .04rem
              color #f90
        .right
          width 20%
          text-align center
          .price-block
            color #dd2727
            .price
              font-size .38rem
</style>
原文地址:https://www.cnblogs.com/j-y-s/p/14903403.html