MyClassList.vue 9.13 KB
<template>
  <div class="sign_in">
    <div class="header">
      <van-swipe class="my-swipe" indicator-color="white" v-if="baseInfo.coverList && baseInfo.coverList.length > 0">
        <van-swipe-item v-for="n in baseInfo.coverList" :key="n.id">
          <video v-if="n.cover_url.indexOf('.mp4') > -1" id="video" :src="n.cover_url" poster="" controls="controls" windowlessvideo="true" playsinline="true" webkit-playsinline="true" x5-playsinline="true" x-webkit-airplay="allow" width="100%" height="260px" type="video/mp4"></video>
          <img v-if="n.cover_url.indexOf('.mp4') == -1" :src="n.cover_url" />
        </van-swipe-item>
      </van-swipe>
      <img v-else src="@/assets/service/defCoure.jpg" alt="" />
    </div>
    <div class="base_info">
      <p class="base_title">{{baseInfo.baseName}}</p>
      <div class="rate">
        <van-rate v-model="baseInfo.baseScore" color="#FFCC00" :size="16" readonly />
        <span>{{ baseInfo.baseScore }}</span>
      </div>
      <p class="address">
        <van-icon name="location" class="icon" />
        {{baseInfo.address}}
      </p>
      <p class="phone">
        <van-icon name="phone" class="icon" />
        {{baseInfo.phone}}
      </p>
    </div>
    <div class="select_student" @click="selectStudent">
      <p class="select_tip">请选择需要打卡的孩子</p>
      <div class="student" v-if="selectedContact.travelerName">
        <span>{{selectedContact.travelerName}}</span>
        <van-icon name="close" class="icon" />
      </div>
      <div class="student" v-else>
        <span>点击选择</span>
      </div>
    </div>
    <div class="btns" @click="getPosition">立即打卡</div>
    <van-popup v-model="failShow" round closeable :style="{ width:'80%'}">
      <div class="success">
        <img src="@/assets/tip1.png" alt="">
        <h3>打卡失败!</h3>
        <p>您当前所在的地理位置不在课程的打卡范围内!</p>
      </div>
    </van-popup>
  </div>
</template>

<script>
export default {
  data () {
    return {
      baseInfo: '',
      list: [],
      baseId: '',
      userInfo: '',
      failShow: false,
      selectedContact: '',//选择的出行人

    }
  },
  mounted () {
    var userInfo = localStorage.getItem('userInfo');
    if (userInfo) {
      this.userInfo = JSON.parse(userInfo);
    }
    // 选择的出行人
    let selectedContactArr = localStorage.getItem('selectedContactArr');
    if (selectedContactArr) {
      selectedContactArr = JSON.parse(selectedContactArr);
      this.selectedContact = selectedContactArr[0]
    }
    this.baseId = this.$route.query.qrresult;
    this.GetStudyBaseDetail(this.baseId);
  },
  methods: {
    AddSign () {

      this.$toast.loading({
        message: '请求中...',
      });
      this.mgop({
        api: 'mgop.sz.hswsy.AddSign', // 必须
        host: 'https://mapi.zjzwfw.gov.cn/',
        dataType: 'JSON',
        type: 'GET',
        appKey: 'fuxgnukl+2001895516+edccpx', // 必须
        headers: {
          //   'isTestUrl': '1'
        },
        data: {
          "userId": this.selectedContact.travelerNum,
          "baseId": this.baseId
        },
        onSuccess: res => {
          this.$toast.success('打卡签到成功');
          setTimeout(() => {
            this.$router.push({ name: 'Home' })
          }, 1000)
        },
        onFail: err => {
          console.log('err', err)
        }
      });
    },
    // 获取基地信息
    GetStudyBaseDetail (baseId) {
      this.$toast.loading({
        message: '请求中...',
      });
      this.mgop({
        api: 'mgop.sz.hswsy.GetStudyBaseDetail', // 必须
        host: 'https://mapi.zjzwfw.gov.cn/',
        dataType: 'JSON',
        type: 'GET',
        appKey: 'fuxgnukl+2001895516+edccpx', // 必须
        headers: {
          //   'isTestUrl': '1'
        },
        data: {
          "userId": 0,
          "cs": '绍兴市',
          "id": baseId
        },
        onSuccess: res => {
          this.$toast.clear()
          console.log('基地信息:', res.data)
          if (res.data.data) {
            this.$toast.clear();
            this.baseInfo = res.data.data;
          } else {
            this.$toast.fail(res.data.message)
          }
        },
        onFail: err => {
          console.log('err', err)
        }
      });
    },
    getPosition () {
      if (!this.selectedContact.travelerNum) {
        this.$toast('请选择需要打卡的孩子');
        return false;
      }
      if (this.baseInfo.signLong == 0 && this.baseInfo.signLat == 0) {  //基地没数坐标
        this.AddSign();
        return false
      }
      var basePosition = [this.baseInfo.signLong, this.baseInfo.signLat];
      AMap.convertFrom(basePosition, 'baidu', function (status, result) {
        console.log('基地定位转换:',result)
        if (result.info === 'ok') {
          basePosition = [result.locations[0].lng, result.locations[0].lat]; // Array.<LngLat>
        }
      });
      this.$toast.loading({
        message: '请求中...',
      });
      this.getNowPosition((posi) => { //获取当前位置坐标
      console.log('获取当前位置坐标:',posi)
        this.$toast.clear();
        if (posi) {
          var nowPosition = [posi.position.lng, posi.position.lat];
          var distance = AMap.GeometryUtil.distance(nowPosition, basePosition);
      console.log('两点距离:',distance)
          console.log(parseInt(distance), nowPosition, basePosition)
          if (parseInt(distance) > 500) {
            this.failShow = true;
          } else {
            // alert('定位小于500m')
            this.AddSign();
          }
        } else {
          // alert('getNowPosition没有返回')
        }
      });
    },
    getNowPosition: function (callback) {
      let mapObj = new AMap.Map('iCenter');
      mapObj.plugin('AMap.Geolocation', function () {
        let geolocation = new AMap.Geolocation({
          enableHighAccuracy: true,//是否使用高精度定位,默认:true
          timeout: 10000,          //超过10秒后停止定位,默认:无穷大
          maximumAge: 0,           //定位结果缓存0毫秒,默认:0
          convert: true,           //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
          showButton: true,        //显示定位按钮,默认:true
          buttonPosition: 'LB',    //定位按钮停靠位置,默认:'LB',左下角
          buttonOffset: new AMap.Pixel(0, 0),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
          showMarker: true,        //定位成功后在定位到的位置显示点标记,默认:true
          showCircle: true,        //定位成功后用圆圈表示定位精度范围,默认:true
          panToLocation: true,     //定位成功后将定位到的位置作为地图中心点,默认:true
          zoomToAccuracy: true      //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
        });
        mapObj.addControl(geolocation);
        geolocation.getCurrentPosition();
        AMap.event.addListener(geolocation, 'complete', function (res) {
          // alert('返回定位信息:' + JSON.stringify(res))
          console.log('返回定位信息:', res)
          callback(res);
        });//返回定位信息
        AMap.event.addListener(geolocation, 'error', function (res) {
          // alert('返回定位出错信息:' + JSON.stringify(res))
          console.log('返回定位出错信息:', res)
          callback();
        });      //返回定位出错信息
      })

    },
    // 选择孩子
    selectStudent () {
      this.$router.push({ name: 'SelectContact', query: { limit: 1, hideParent: 1 } })
    }
  }
}
</script>

<style lang="scss" scoped>
.sign_in {
  padding-bottom: 100px;
  .header {
    img {
      width: 100%;
    }
  }
  .base_info {
    width: 702px;
    margin: 0 auto;
    padding-top: 20px;
    .base_title {
      font-size: 34px;
      font-weight: bold;
    }
    .rate {
      margin-top: 20px;
      span {
        font-size: 30px;
        color: #ffcc00;
        margin-left: 30px;
      }
    }
    .address,
    .phone {
      font-size: 24px;
      color: #999;
      margin-top: 16px;
      .icon {
        color: #000;
      }
    }
  }
  .select_student {
    width: 702px;
    margin: 0 auto;
    margin-top: 30px;
    padding-top: 30px;
    border-top: 2px solid #d8d8d8;
    .select_tip {
      font-size: 30px;
      color: #999;
    }
    .student {
      position: relative;
      width: 532px;
      line-height: 78px;
      margin: 0 auto;
      margin-top: 24px;
      background: #f5f6fa;
      border-radius: 8px;
      font-size: 28px;
      text-align: center;
      .icon {
        position: absolute;
        top: 50%;
        right: 20px;
        transform: translateY(-50%);
      }
    }
  }

  .btns {
    width: 702px;
    margin: 0 auto;
    margin-top: 100px;
    text-align: center;
    line-height: 90px;
    border-radius: 100px;
    font-size: 30px;
    background: #4092ff;
    color: #fff;
  }
  .success {
    padding: 40px 0;
    text-align: center;
    img {
      width: 30%;
    }
    h3 {
      font-size: 36px;
    }
    p {
      font-size: 30px;
      color: #999999;
    }
  }
}
</style>