StudentDetail.vue 10.5 KB
<template>
  <div class="student_detail">
    <div class="infomation">
      <div class="top">
        <div>
          <img class="head" :src="defaultHead" alt="">
          <div class="right">
            <p class="name">{{studentInfo.travelerName}}<span v-if="studentInfo.enrollYear">{{studentInfo.enrollYear}}级</span></p>
            <p class="school_name">{{studentInfo.schoolName}}</p>
          </div>
        </div>
        <HomeScan></HomeScan>
      </div>
      <div class="count_box">
        <div class="count_item">
          <p class="count"><span>{{signCheckCountInfo.signCount}}</span>/次</p>
          <p class="des">基地打卡次数</p>
        </div>
        <div class="line"></div>
        <div class="count_item">
          <p class="count"><span>{{signCheckCountInfo.courseDays}}</span>/天</p>
          <p class="des">课程实践</p>
        </div>
      </div>
      <div class="icon_box">
        <div class="icon_item" @click="handleYanxue">
          <img src="@/assets/home/stu_icon1.png" alt="">
          <p>研学码</p>
        </div>
        <div class="icon_item" @click="contactService">
          <img src="@/assets/home/stu_icon2.png" alt="">
          <p>专属客服</p>
        </div>
        <div class="icon_item">
          <img src="@/assets/home/stu_icon3.png" alt="">
          <p>敬请期待</p>
        </div>
      </div>
    </div>
    <div class="list_box">
      <van-tabs v-model="active" color="#21A3FF">
        <van-tab title="基地记录">
          <div class="list_item" v-for="(item,index) in baseList" :key="index">
            <div class="left">
              <p class="day">{{item.day}}</p>
              <p class="minute">{{item.minute}}</p>
            </div>
            <div class="line"></div>
            <div class="right">
              <img :src="item.baseUrl" alt="">
              <p class="item_title">{{item.baseName}} </p>
              <button class="active" v-if="item.evaluationId==0" @click="evaluateBase(item)">去评价</button>
              <button v-else @click="evaluateBaseDetail(item)">查看评价</button>
            </div>
          </div>
          <van-empty v-if="baseList.length==0" description="暂无基地记录" />
        </van-tab>
        <van-tab title="课程记录">
           <div class="list_item" v-for="(item,index) in courseList" :key="index">
            <div class="left">
              <p class="day">{{item.day}}</p>
              <p class="minute">{{item.minute}}</p>
            </div>
            <div class="line"></div>
            <div class="right">
              <img :src="item.baseUrl" alt="">
              <p class="item_title">{{item.baseName}} </p>
              <button class="active" v-if="item.evaluationId==0" @click="evaluateCourse(item)">去评价</button>
              <button v-else @click="evaluateCourseDetail(item)">查看评价</button>
            </div>
          </div>
          <van-empty v-if="courseList.length==0" description="暂无课程记录" />
        </van-tab>
      </van-tabs>
    </div>
  </div>
</template>
<script>
import HomeScan from '@/views/Home/component/HomeScan'
export default {
  data () {
    return {
      defaultHead: require('@/assets/home/head.png'),
      studentInfo: '',
      courseList: [],//课程记录
      baseList: [],//基地记录
      signCheckCountInfo:'',//打卡和课程天数信息
      active: 0
    }
  },
  mounted () {
    let studentInfo = localStorage.getItem('StudentDetialInfo')
    this.studentInfo = JSON.parse(studentInfo)
    this.$nextTick(() => {
      if (!this.studentInfo?.travelerNum) {
        this.$toast.fail('学生信息缺失,请返回首页重试')
        return;
      }
      this.$toast.loading({
        message: '加载中...',
        duration: 0,
        forbidClick: true
      })
      this.getCourseList()
      this.getBaseList()
      this.getSignCheckCountInfo()
    })
  },
  methods: {
    // 获取课程记录
    getCourseList () {

      this.yxAxios.post(`${this.yanxueUrl}/api/StudiesWap/CourseCheckDetail/List`, {
        "userId": this.studentInfo?.travelerNum,
        "pageIndex": 1,
        "pageSize": 999
      }).then((res) => {
        this.$toast.clear()
        console.log('课程记录:', res.data)
        if (res.data.status == 1) {
          let courseList = res.data.data.data
          for(let i in courseList){
            courseList[i].day = this.Moment(new Date(courseList[i].time)).format('MM-DD')
            courseList[i].minute = this.Moment(new Date(courseList[i].time)).format('HH:mm')
          }
          this.courseList  = courseList 
          console.log(this.courseList)
        } else {
          this.$toast.fail(res.data.message)
        }
      })
    },
    // 获取基地记录
    getBaseList () {
      this.yxAxios.post(`${this.yanxueUrl}/api/StudiesWap/SignDetail/List`, {
        "userId": this.studentInfo?.travelerNum,
        "pageIndex": 1,
        "pageSize": 999
      }).then((res) => {
        this.$toast.clear()
        console.log('基地记录:', res.data)
        if (res.data.status == 1) {
          let baseList = res.data.data.data
          for(let i in baseList){
            baseList[i].day = this.Moment(new Date(baseList[i].time)).format('MM-DD')
            baseList[i].minute = this.Moment(new Date(baseList[i].time)).format('HH:mm')
          }
          console.log(baseList)
          this.baseList  = baseList 
        } else {
          this.$toast.fail(res.data.message)
        }
      })
    },
    // 根据用户编号获取打卡和课程天数信息
    getSignCheckCountInfo () {
      this.yxAxios.get(`${this.yanxueUrl}/api/StudiesWap/SignCheckCountInfo/ByUserId?userId=${this.studentInfo?.travelerNum}`).then((res) => {
        this.$toast.clear()
        console.log('天数:', res.data)
        if (res.data.status == 1) {
          this.signCheckCountInfo = res.data.data
        } else {
          this.$toast.fail(res.data.message)
        }
      })
    },
    // 研学码
    handleYanxue () {
      this.$router.push({ name: 'YanxueCode' })
    },
    // 联系客服
    contactService () {
      // if (this.detailData.mobiles) {
      //   location.href = "tel://" + this.detailData.mobiles.split(",")[0];
      // }
    },
    // 基地评价
    evaluateBase(item){
      this.$router.push({ name: 'evaluateBase',query:{baseId:item.baseId,signId:item.signId}})
    },
    // 课程评价
    evaluateCourse(item){
      let courseInfo = item;
      courseInfo.id = courseInfo.orderId
      window.localStorage.setItem('courseInfo', JSON.stringify(courseInfo))
      this.$router.push({ name: 'evaluateCourse'})
    },
    // 基地评价详情
    evaluateBaseDetail(item){
      this.$router.push({ name: 'evaluateDetail',query:{evaluationId:item.evaluationId,baseId:item.baseId}})
    },
    // 课程评价详情
    evaluateCourseDetail(item){
      this.$router.push({ name: 'evaluateDetail',query:{evaluationId:item.evaluationId}})
    }
  },
  components: {
    HomeScan
  },
}
</script>
<style lang="scss" scoped>
.student_detail {
  height: 100%;
  background: rgb(247, 247, 251);
  .infomation {
    width: 100%;
    height: 852px;
    background: url("~@/assets/home/bg_stu.png");
    background-size: 100%;
    background-position: center;
    .top {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      justify-content: space-between;
      padding: 40px 28px;
      > div {
        display: flex;
      }
      .head {
        width: 96px;
        height: 96px;
        border-radius: 50%;
        overflow: hidden;
      }
      .right {
        width: 450px;
        height: 96px;
        margin-left: 24px;
        display: flex;
        align-content: space-around;
        flex-wrap: wrap;
        color: #fff;
        .name {
          font-size: 34px;
          font-weight: bold;
          width: 100%;
          span{
            display: inline-block;
            padding: 0 14px;
            margin-left: 14px;
            line-height: 34px;
            border-radius: 17px;
            font-size: 22px;
            background: #2D90D2;
            vertical-align: middle;
          }
        }
        .school_name {
          font-size: 26px;
        }
      }
    }
    .count_box {
      display: flex;
      align-items: center;
      justify-content: space-around;
      padding: 0 24px;
      margin-top: 30px;
      .count_item {
        color: #fff;
        text-align: center;
        .count {
          font-size: 24px;
          span {
            font-size: 38px;
            font-weight: bold;
            margin-right: 6px;
          }
        }
        .des {
          margin-top: 14px;
          font-size: 28px;
        }
      }
      .line {
        width: 4px;
        height: 48px;
        background: #fff;
      }
    }
    .icon_box {
      display: flex;
      align-items: center;
      justify-content: space-around;
      width: 702px;
      height: 158px;
      background: #ffffff;
      border-radius: 16px;
      margin: 0 auto;
      margin-top: 30px;
      .icon_item {
        text-align: center;
        img {
          width: 70px;
        }
        p {
          font-size: 26px;
        }
      }
      .line {
        width: 4px;
        height: 48px;
        background: #fff;
      }
    }
  }
  .list_box {
    width: 702px;
    margin: 0 auto;
    margin-top: -300px;
    overflow: hidden;
    border-radius: 16px;
    background: #fff;
    .list_item {
      position: relative;
      display: flex;
      align-items: center;
      &:first-of-type {
        margin-top: 20px;
      }
      .left {
        width: 110px;
        padding-right: 30px;
        text-align: right;
        font-size: 34px;
        .day{
          
        }
        .minute{
          font-size: 30px;
          color: #999;
        }
      }
      .line {
        width: 2px;
        height: 188px;
        background: #e5e5e5;
        border-radius: 1px;
      }
      .right {
        margin-left: 30px;
        img {
          display: inline-block;
          width: 128px;
          height: 128px;
          border-radius: 16px;
        }
        .item_title {
          display: inline-block;
          width: 360px;
          margin-left: 22px;
          font-size: 30px;
          vertical-align: top;
        }
        button {
          position: absolute;
          bottom: 30px;
          right: 20px;
          width: 144px;
          line-height: 44px;
          background: #fff;
          color: #21a3ff;
          border-radius: 8px;
          border: 2px solid #21a3ff;
          font-size: 26px;
          &.active {
            background: #21a3ff;
            color: #fff;
          }
        }
      }
    }
  }
}
</style>